我想在我的应用程序中实现一个帮助表单,即使显示对话框,它也可以获得焦点。目前,如果无法集中精力,我会处理我的帮助的实际实例,但我认为这不是正确的方法。所以我想问,是否有一个选项可以显示表单,与我的主应用程序的逻辑分开。
我尝试过的事情:
- 作为 AppDomain 调用 ( MSDN )
- 将帮助放入单独的应用程序中并将其作为进程调用
在这两种方式中,当调用对话框时,help(-form) 都无法重新获得焦点。
我不想使用 C# 提供的帮助,因为我需要在应用程序内显示帮助(-pages)。
谢谢
PS:我使用的是.Net 2.0。
最佳答案
您可以通过创建 STA 线程并使用 Application.Run()
从该单独的线程显示表单来实现此目的。 Application.Run()
将为其他表单创建一个单独的消息泵;这就是它保持独立的原因。
如果您这样做,则在表单之间进行通信时必须非常小心。您将需要使用 Control.Invoke() 或其他线程间机制从第一个表单调用第二个表单上的 UI 更改方法(反之亦然)。
但是如果您这样做,那么第一个表单可以显示模式对话框,而第二个表单仍然可以聚焦。
请注意,第二个窗口可能位于第一个窗口后面,因为无法指定它们之间的相对 Z 顺序。
显示第二种形式可以这样完成:
private static void ShowIndependentForm()
{
Thread thread = new Thread(ShowIndependentFormImpl);
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
}
private static void ShowIndependentFormImpl()
{
Application.Run(new Form2());
}
您可以在适当的情况下调用 ShowIndependentForm() ;可能是在创建主窗体后从主窗体中获取的,但我在 Main()
中的测试代码如下所示:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ShowIndependentForm();
Application.Run(new Form1());
}
重要
因为第二个表单有自己的消息泵,所以关闭第一个表单不会关闭程序,除非将 Thread.IsBackground
设置为 true。如果不这样做,则必须在第一个表单关闭时显式关闭第二个表单(通过使用 Control.Invoke()
或其他方式调用第二个表单中的方法)(如果您愿意)程序自动关闭。
关于C#/Winforms : Always keep a form focusable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15633045/