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

本文关键字:显示 WinForms 模态 对话框 线程 WPF 应用程序 | 更新日期: 2023-09-27 18:09:44

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

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

跨线程操作无效:控制'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();
}

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

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