如何从WPF应用程序线程显示WinForms模态对话框

时间:2011-09-26 10:57:17

标签: c# wpf winforms multithreading dispatcher

我有一个WPF应用程序。该应用程序的主窗口有一个按钮。单击此按钮时,我在单独的线程中打开WinForms模式对话框。我遇到的麻烦是对话框的行为不像模态,即仍然可以将焦点切换到主窗口,而我需要将焦点放在新打开的对话框上,不应该选择主要对话框窗口。

注意:我无法将modalDialog.ShowDialog();移到委托之外,因为对话框表单会动态创建控件,这意味着这些控件必须保留在创建它的线程上。更清楚的是,如果我将modalDialog.ShowDialog();移到外面,我会得到一个例外:

  

跨线程操作不是vaild:控制从其创建的线程以外的线程访问的'DynamicList'。

关于如何使表单表现为模态的任何想法?

以下是代码:

private void button1_Click(object sender, RoutedEventArgs e)
{
   DoSomeAsyncWork();
}

private void DoSomeAsyncWork()
{ 
  var modalDialog = new TestForm();
  var backgroundThread = new Thread((
     delegate()
     {
          // Call intensive method that creates dynamic controls
          modalDialog.DoSomeLongWaitingCall();
          modalDialog.ShowDialog();
     }
   ));
  backgroundThread.Start();
}

1 个答案:

答案 0 :(得分:2)

您应始终在UI线程上创建控件。如果您这样做,则通过ShowDialog()调用Dispatcher应该有效。