2011-09-26 67 views
1

我有一个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(); 
} 
+0

你不能使这项工作。使用Dispatcher.Invoke()在主线程上执行ShowDialog()调用。 –

+0

如果我这样做,我得到以下错误:“跨线程操作不vaild:控制'DynamicList'从一个线程访问,而不是它创建的。”因为我已经在后台线程上创建了对象。 – fin

+1

只能在工作线程上创建表单需要的* data *。所有用户界面都需要在UI线程上完成。没有例外。潘打算。 –

回答

2

你应该总是在UI线程上创建控件。如果你这样做,拨打ShowDialog()Dispatcher应该工作。

+0

用于创建控件的过程位于外部库中。不幸的是,这不是一个选择。 – fin

+0

@FinbarLeahy,那么你可能运气不好。 – svick

+0

可以使用后台工作人员解决问题吗? – fin

相关问题