いつもTwitterでお世話になっているmisoさんが悩んでられました。
本当にプログラム側からページを閉じる処理ってどうやればいいんだ、BackKeyPreessでしか閉じられないのか? #wp7dev_jp
— 99CAR (@misodengaku) 2012, 2月 4
@ch3cooh プログラム内から呼び出されるページをタイルからいきなり呼び出して、処理が終わったらページを閉じる、ってーのがやりたいんです・・・ GoBackでやってたんですけどMarketplaceに投げたら例外の報告が大量に()
— 99CAR (@misodengaku) 2012, 2月 4
前のページに戻るだけであれば、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は意図した例外を発生させてアプリケーションを終了する方法を採用しているみたいです。
@ch3cooh なので、本のTipでも書いた App.xaml でException起こして UnhandledExceptionでハンドリングして終了させる方法はぎりぎりセーフなのかも。Exceptionは起きるけど、ハンドリングしてるので。
— しのぶ (@shinoblogavi) 2012, 2月 4
やっぱりアプリを終了するにはclass AppQuitException : Exceiption{} ... throw new AppQuitException(); ですよね(
— ゆたか (@tmyt) 2012, 2月 4
こちらについても説明します。
開発中に例外を発生させてアプリケーションが、強制的に終了させてしまった経験は多々あると思います。
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(); }