2013-12-15 28 views
0

這是一個調用自定義C#消息框的函數。該功能是從模擬進程中調用的,該進程在不是UI線程的線程內運行。將主窗口設置爲從STA線程調用的對話所有者(消息框)

public Output.ButtonResult msgboxYesNo(string Text, string title) { 
    Output.Message_Box msg = new Output.Message_Box(); 

    msg.Dispatcher.Invoke(new Action(() => { 
     msg.seeQuestion(Text, title); 
     msg.Topmost = true; 
     Application.Current.MainWindow.Dispatcher.Invoke(new Action(() 
          => { msg.Owner = Application.Current.MainWindow; })); 
     msg.ShowDialog();     
    })); 

    return msg.result; 
} 

有問題的線是這個:

Application.Current.MainWindow.Dispatcher.Invoke(new Action(() => 
           { msg.Owner = Application.Current.MainWindow; })); 

它拋出這個:

,因爲不同的 線程擁有它

調用線程不能訪問該對象

因爲我想將主窗口設置爲t他是自定義消息框的所有者,在分離的線程中調用該消息框。

如何設置主窗體作爲消息框的所有者?

(我希望我解釋這個問題不夠清楚,形式是WPF)

回答

1

Output.Message_Box是一個UI組件,所以應該從UI線程,而不是從後臺線程創建。

問題在你的代碼 -

msgcreated on background thread但你想access it from UI thread這裏

msg.Owner = Application.Current.MainWindow; 

相反,你應該甚至create message box on UI thread only

Application.Current.Dispatcher.Invoke(new Action(() => 
{ 
    Output.Message_Box msg = new Output.Message_Box(); 
    msg.seeQuestion(Text, title); 
    msg.Topmost = true; 
    msg.Owner = Application.Current.MainWindow; 
    msg.ShowDialog(); 

    return msg.result;    
})); 

而且你想從後臺線程訪問MainWindow它是在UI線程上創建的。 如果應用程序僅從主線程啓動,您可以像這樣獲得UI調度程序:Application.Current.Dispatcher

+0

感謝您的啓發,我現在已經清楚!我會補充說,我無法在調度程序內做出回報,我必須進行變量調整,然後返回外部。 –

相關問題