2013-03-26 28 views
2

我想在我的應用程序中實現幫助窗體,如果顯示對話框,它可以獲得焦點,甚至。目前我處理我的幫助的實際情況,如果它不能集中,但我不認爲這是正確的方式。所以我想問一下,如果這是一個顯示錶單的選項,與我的主應用程序的邏輯分離。C#/ Winforms:始終保持窗體可以對焦

事情我嘗試:

  • 調用的應用程序域(MSDN
  • 將幫助到單獨的應用程序,並把它作爲一個過程

在這兩個方面,幫助( - 表單)在調用對話框時無法獲得焦點。

我不想使用C#提供的幫助,因爲我需要在應用程序內部顯示幫助(-pages)。

謝謝

PS:我正在使用.Net 2.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爲真,否則不要關閉程序。如果你不這樣做,那麼當第一個表單關閉時,如果你想讓程序自動關閉,你必須明確地關閉第二個表單(通過使用Control.Invoke()或其他方式調用第二個表單的方法)。

+0

設置Thread.IsBackground = true足以避免關閉程序的麻煩。您可能應該說一些有關Z-order問題的知識,幫助窗口可能顯示在另一個窗口後面。 – 2013-03-26 09:52:55

+0

好點,我會更新。 – 2013-03-26 09:55:27

+0

謝謝!我在穿線方面遇到了一些麻煩,但現在它像想要的那樣工作:) – TheQaa 2013-03-26 10:02:15

相關問題