我有一個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線程上完成。沒有例外。潘打算。 –