2017-06-27 75 views
0

當我的程序正在關閉時(由Application.Shutdown()啓動),我正在捕獲主窗口上的Closing事件。在處理程序中,我創建一個對話框,詢問用戶是否想保存他們的工作。在這種特定情況下,用戶不能取消應用程序關閉事件,這對我來說很好。在調用Application.Shutdown()之後,使用ShowDialog顯示窗口不起作用

我發現如果我通過ShowDialog啓動「想要保存」窗口,窗口永遠不會顯示。但是,MessageBox.Show確實顯示一個窗口。這是應用程序關閉期間的預期行爲?我無法在有關此行爲的文檔中找到任何內容。如果有人能指點我相關的文件或對這個問題的詳細答案,那會很好。

回答

3

Application.Shutdown最終會停止您的應用程序的消息循環(Dispatcher)。之後沒有任何UI會發生。 MessageBox.Show工作的唯一原因是它在應用程序的活動窗口上創建了自己的內部消息循環。

+0

那麼這將使一些感覺呢。文檔中有關於此的任何內容? – skybluecodeflier

+0

@skybluecodeflier當然 - .NET源代碼。這裏是Application.Shutdown在幾個方法調用後最終到達Dispatcher.CriticalInvokeShutdown的行。 http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Application.cs,2502 – hoodaticus

0

如果使用Application.Current.MainWindow.Close();,這將允許您使用 e.Cancel = true;,在這之後,如果你使用Application.Current.Shutdown();它會忽略取消標誌,並關閉該窗口。

這是假設您只使用一個窗口,當然將不需要再次顯示您的提示。

喜歡的東西:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    e.Cancel = true; 

    DisplayCloseConfirmation(); 
} 

編輯基於評論

+1

實際上,這是不可能的,因爲在忽略應用程序關閉期間的窗口關閉事件中設置e.Cancel = true。請參閱https://msdn.microsoft.com/en-us/library/ms597013(v=vs.110).aspx – skybluecodeflier

+0

啊,對。我的錯,我使用'Application.Current.MainWindow.Close();'最初允許我的應用程序關閉提示。謝謝你指出! :) –

相關問題