2013-03-26 109 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