如何在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();
}
您应该始终在UI线程上创建控件。如果您这样做,通过Dispatcher
调用ShowDialog()
应该可以工作。