我有一个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();
}
答案 0 :(得分:2)
您应始终在UI线程上创建控件。如果您这样做,则通过ShowDialog()
调用Dispatcher
应该有效。