オルタナティブ・ブログ > IT's my business >

IT業界のコメントマニアが始めるブログ。いつまで続くのか?

(XAML#23)「シャットダウンを検出する」

»

9日目に書いたように、アプリケーション(Application)の ShutdownMode によってメインウィンドウを閉じたり、最後のウィンドウを閉じることでアプリケーションは終了します。このようにウィンドウを閉じる際には、閉じる前に Closing、閉じた後に Closed イベントが発生するため、これらにウィンドウを閉じるときの処理を記述できます。たとえば、次のようなイベントハンドラを定義することで、実際にウィンドウを閉じる前に確認用のダイアログボックスを表示することができます。

[XAML]
<Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApp1"
    Title="MainWindow" Height="400" Width="600"
    Closing="Window_Closing">

[コード]
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    if (MessageBox.Show("終了してもよいですか?", "確認", MessageBoxButton.YesNo)
            == MessageBoxResult.No)
        e.Cancel = true;
}

しかし、これらのイベントは Windows 自身をシャットダウンしたり、ログオフ(サインオフ)するときには呼び出されません。たとえば、ウィンドウの Closed イベントで、メモリ中にキャッシュしていたデータを保存するといった処理を定義していても、Windows 自身が強制終了した場合には実行されないことになります。

このような場合には、アプリケーションの SessionEnding イベントハンドラーを定義します。具体的には App.xaml と App.xaml.cs を次のように定義します。

[XAML]
<Application x:Class="WpfApplication1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApp1"
    StartupUri="MainWindow.xaml"
    SessionEnding="Application_SessionEnding">
    ...

[コード]
public partial class App : Application
{
    private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e)
    {
        // 終了処理(キャッシュデータの保存など)
    }
}

イベントハンドラーに渡される SessionEndingCancelEventArgs 型のパラメータ e には、ReasonSessionEnding というプロパティが含まれています。このプロパティはこのイベントハンドラーが呼び出された理由(Logoff か Shutdown のいずれか)が渡されます。また、この引数の Cancel プロパティを true に設定すると、シャットダウンを中断できます。

Xaml23

Comment(0)