酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Phoneでナビゲーション履歴を無視してアプリケーションを一気に終了させる

いつもTwitterでお世話になっているmisoさんが悩んでられました。

前のページに戻るだけであれば、NavigationService.GoBackメソッドを使えば良いのですが、処理を実行後にアプリケーションを終了させたいというのが分かりました。

Windows Phoneのユーザー操作の一貫性が損なわれてしまいいますので、ルートページでBackキー以外の終了は推奨されていませんが、止む得ない事情でルートページではないページでアプリケーションを終了させる方法が2通り存在します。

XNA FrameworkのGameクラスを使用する方法

GameクラスのExitメソッドを使用します。

ソリューションエクスプローラーでプロジェクトを右クリックして、メニューの中から[参照の追加]を選択します。参照の追加ダイアログから「Microsoft.Xna.Framework.Game」を選択して[追加]ボタンをクリックします。

private void button3_Click(object sender, RoutedEventArgs e) {
    // アプリケーションを終了させる
    var game = new Microsoft.Xna.Framework.Game();
    game.Exit();
}

例外を使用する方法

開発中に例外を発生させてアプリケーションが、強制的に終了させてしまった経験は多々あると思います。

高橋さんとid:tmytは意図した例外を発生させてアプリケーションを終了する方法を採用しているみたいです。

こちらについても説明します。

開発中に例外を発生させてアプリケーションが、強制的に終了させてしまった経験は多々あると思います。

App.xaml.csで下記のコードを実装します。任意のタイミングでQuitメソッドを呼び出すと必ずApplicationQuitExceptionが起きるのでアプリケーションは終了してしまいます。
クラッシュしたエラーではないことを示すために、UnhandledExceptionイベントハンドラでは型のチェックをして何もせずに終了させています。

// ハンドルされない例外の発生時に実行されるコード
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) {

    // 意図した例外なので何もせずに終了させる
    if (e.ExceptionObject is ApplicationQuitException) {
        return;
    }

    if (System.Diagnostics.Debugger.IsAttached) {
        // ハンドルされない例外が発生しました。デバッガーで中断します。
        System.Diagnostics.Debugger.Break();
    }
}

// アプリケーション終了用の例外クラス
private class ApplicationQuitException : Exception { }

// アプリケーションを終了させるためのメソッド
public static void Quit() {
    throw new ApplicationQuitException();
} 

実際にMainPage.xaml.cs等で使用する場合には、以下のようにシンプルにアプリケーションを終了させることができます。

private void button4_Click(object sender, RoutedEventArgs e) {
    // アプリケーションを終了させる
    App.Quit();
}