我有一个WPF应用程序。这个应用程序的主窗口有一个按钮。当单击此按钮时,我在单独的线程中打开一个WinForms模式对话框。我遇到的麻烦是对话框的行为不像一个模式,即它仍然可以将焦点切换到主窗口,而我需要让焦点对准新打开的对话框,并且不应该可以选择主对话框窗口。如何从WPF应用程序线程显示WinForms模态对话框
注意:我无法将modalDialog.ShowDialog();
移动到委托之外,因为对话框表单动态创建控件,这意味着这些控件必须保留在创建它的线程上。为了更清楚,如果我移动modalDialog.ShowDialog();
外,我会得到一个异常,像这样:
Cross-thread operation not vaild: Control 'DynamicList' accessed from a thread other than the one it was created on.
任何想法,我可能会做出怎样的形式表现为一个模式?
下面是代码:
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();
}
你不能使这项工作。使用Dispatcher.Invoke()在主线程上执行ShowDialog()调用。 –
如果我这样做,我得到以下错误:“跨线程操作不vaild:控制'DynamicList'从一个线程访问,而不是它创建的。”因为我已经在后台线程上创建了对象。 – fin
只能在工作线程上创建表单需要的* data *。所有用户界面都需要在UI线程上完成。没有例外。潘打算。 –