您可以通过创建一个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
为真,否则不要关闭程序。如果你不这样做,那么当第一个表单关闭时,如果你想让程序自动关闭,你必须明确地关闭第二个表单(通过使用Control.Invoke()
或其他方式调用第二个表单的方法)。
设置Thread.IsBackground = true足以避免关闭程序的麻烦。您可能应该说一些有关Z-order问题的知识,帮助窗口可能显示在另一个窗口后面。 – 2013-03-26 09:52:55
好点,我会更新。 – 2013-03-26 09:55:27
谢谢!我在穿线方面遇到了一些麻烦,但现在它像想要的那样工作:) – TheQaa 2013-03-26 10:02:15