2012-12-26 51 views
2

我的模態WPF對話框偶爾會在主應用程序窗口後面出現問題。當我單擊對話框上的按鈕時,會出現這種情況,該對話框會在主應用程序窗口中執行一些處理和更新控件(通過綁定)。當它進入後臺時,單擊應用程序中的任何位置都會將其帶回前臺。WPF模態對話框在後臺進行

 var dialog = LoadDialogWindowThroughMEF(); 
     dialog.Owner = Application.Current != null ? Application.Current.MainWindow : null; 
     dialog.ShowInTaskbar = false; 
     dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner; 
     return dialog.ShowDialog(); 

上面的代碼顯示了我如何打開模式窗口。這很少發生。

有誰知道可能是什麼問題?

+0

請參閱此鏈接(http://stackoverflow.com/questions/6233182/keeping-dialogs-on-top-of-window-but-not-on-top-of-everything)。也許如果你設置dialog.Topmost = true,它可以解決問題。 – Ramin

+0

我上面粘貼的代碼與上面的鏈接建議的代碼相同。 – Chetan

+0

'Application.Current'有可能是'null'嗎? –

回答

2

我不知道我對你的答案,但我可以分享我的一些想法:

我遇到這類問題時,它都會發生因爲Owner沒有設置正確。所以,我會嘗試而不是設置Owner,看看是否會使問題重現。您需要絕對確保Owner始終設置爲正確的父窗口。您可能還想檢查它是應用程序的實際MainWindow應該是父項。我認爲大多數情況下,在你的代碼中顯式地使用是有益的。在這種情況下,這意味着最好分配已知父代(也許您可以在某處使用可引用的父代),而不是依靠Application.Current爲您提供該參考。這樣做會將您的任務控制爲Owner。它甚至可以使擺脫?:運營商成爲可能,因爲即使在單元測試期間你也可以控制參考。

我也希望您確保實際更新父窗口的代碼不會以任何方式將焦點強制到父窗口上的特定控件或類似的東西。 (只要正確的父親設置爲Owner,我不認爲這是一個可能的問題。)

我希望這可以幫助你,但我明白,如果它不。你的對話框再次出現,當你點擊父窗口的事實駁斥了部分(或全部!)我點的......你運行單元測試時


除此之外,但這是一個完全不同的事情。

如根據wiktionary.org/wiki/explicit的單詞的第一個意義,而不是隱式