2009年8月19日 星期三

取得視窗關閉的理由 - CloseReason

在.net form預設的事件處理裡面有FormClosing

private void Form1_FormClosing(object sender,
FormClosingEventArgs e){...}

在視窗被關閉的時候會被啟動
e.CloseReason就是這個event發生的原因,常用如下
CloseReason說明
UserClosing使用者按下此form右上角的關閉按鈕
TaskManagerClosing用工作管理員強制關閉
WindowsShutDown關機的時候所觸發
UserClApplicationExitCallosing所從屬的應用程式被關閉時呼叫

此時可以針對不同的需求來做不同的處理
例如讓使用者做再一次的確認
並用e.Cancel抑制關閉事件的發生

private void Form1_FormClosing(object sender,
FormClosingEventArgs e)
{
/// if the close button in the title bar is clicked
if (e.CloseReason == CloseReason.UserClosing)
{
/// ask the user whether close or not
if (MessageBox.Show("Leave?", "warning",
MessageBoxButtons.YesNo) ==
DialogResult.No)
{
/// cancel the process of closing
e.Cancel = true;
}
}
}

但是到了WPF之後
Window的Closing事件和應用程式的關閉已經切開了
在Window的Closing事件中仍然可以被制止

private void Window_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
/// ask the user whether close or not
if (MessageBox.Show("Leave?", "warning",
MessageBoxButton.YesNo) ==
MessageBoxResult.No)
{
/// cancel the process of closing
e.Cancel = true;
}
}

但這時候已經沒有CloseReason可以選用了
因為單一視窗並不影響Application是否關閉
Application預設的關閉條件是最後的視窗被關閉
所以原先所提供的選項已經不再有意義

這時候如果仍然希望知道Application被關閉的原因
Application有提供SessionEnding事件
在Application的XAML裡面加上

<Application
...
SessionEnding="Application_SessionEnding">
<Application.Resources>
</Application.Resources>
</Application>

在程式碼中會看到

private void Application_SessionEnding(object sender,
SessionEndingCancelEventArgs e){...}

這時候可以從e.ReasonSessionEnding得到簡單的關閉原因

--
參考資料
WPF - Closing Application
表單右上角之關閉功能

沒有留言:

張貼留言