您可以通過創建一個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