2011-09-26 28 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

相關問題