C#/ Winforms:始终保持一个可关注的表格

时间:2013-03-26 09:05:35

标签: c# winforms focus .net-2.0

我想在我的应用中实现一个帮助表单,如果显示对话框,它可以获得焦点,甚至。目前我处理我的帮助的实际情况,如果它无法集中,但我不认为这是正确的方式。所以我想问一下,如果有一个显示表单的选项,则与我的主应用程序的逻辑分开。

我尝试的事情:

  • 作为AppDomain(MSDN
  • 进行呼叫
  • 将帮助放入单独的应用程序并将其称为过程

在两种方式中,当调用对话框时,帮助(-form)无法获得焦点。

我不想使用C#提供的帮助,因为我需要在应用程序中显示帮助(-pages)。

由于

PS:我正在使用.Net 2.0。

1 个答案:

答案 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>