2017-02-14 128 views
0

我有以下情況:WPF - 視窗設定所有者

  • 示出了所述參考存儲在一個工具類的窗口。
  • 後來需要出現一個模式對話框以上那個窗口;所以我做了以下內容:

    OptionalMessageBox message = new OptionalMessageBox(title, errorMessage.ToString(), MessageImage.Warning); 
    if (UIUtilities.TopWindow != null) 
    { 
        UIUtilities.TopWindow.Dispatcher.Invoke(() => message.Owner = UIUtilities.TopWindow); 
        UIUtilities.TopWindow.Dispatcher.Invoke(() => message.ShowDialog()); 
    } 
    else 
    { 
        message.ShowDialog(); 
    } 
    

然而,這是給經典的「調用線程,因爲不同的線程擁有它無法訪問該對象」雖然我不明白爲什麼,因爲我現在用的是TopWindow變量的調度器。作爲一個說明(並且絕望),我試圖把這些調用放在我剛剛創建的消息變量上 - 這也不起作用,但我沒有想到這會成爲問題,因爲如果我剛剛擁有了它,我現在怎麼擁有它做好了!

任何意見將不勝感激。

回答

0

試試這個:

if (UIUtilities.TopWindow != null) 
     { 
      UIUtilities.TopWindow.Dispatcher.Invoke(() => { 

       OptionalMessageBox message = new OptionalMessageBox(title, errorMessage.ToString(), MessageImage.Warning); 
       message.Owner = UIUtilities.TopWindow; 
       message.ShowDialog(); 

      }); 
     } 
else 
{ 
    OptionalMessageBox message = new OptionalMessageBox(title, errorMessage.ToString(), MessageImage.Warning); 
       message.ShowDialog(); 
} 
0

您可以使用此

App.Current.Dispatcher.Invoke(() => { 
OptionalMessageBox message = new OptionalMessageBox(title, errorMessage.ToString(), MessageImage.Warning); 
message.Owner = App.Current.MainWindow; 
message.ShowDialog(); 
}); 
+0

謝謝,但需要訪問應用程序的能力 - 對方的回答刪除了要求。 –

+0

您可以隨時訪問應用程序。請注意,「Application.Current.Dispatcher最可能的ReferenceEquals()幾乎總是Window.Dispatcher,這意味着它們是同一個」請參閱http://stackoverflow.com/questions/28703717/the-difference-between-application-調度程序和窗口調度程序 – Ron

+0

另請注意,在其他答案中,如果TopWindow爲空,則不會顯示消息。這不是問題中提出的問題。 – Ron

相關問題