我想在我的应用中实现一个帮助表单,如果显示对话框,它可以获得焦点,甚至。目前我处理我的帮助的实际情况,如果它无法集中,但我不认为这是正确的方式。所以我想问一下,如果有一个显示表单的选项,则与我的主应用程序的逻辑分开。
我尝试的事情:
在两种方式中,当调用对话框时,帮助(-form)无法获得焦点。
我不想使用C#提供的帮助,因为我需要在应用程序中显示帮助(-pages)。
由于
PS:我正在使用.Net 2.0。
答案 0 :(得分:3)
您可以通过创建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()
或其他方式调用第二个表单中的方法),如果您希望程序自动关闭。 / p>