看到題目可能有些同學覺得這是一個老生常談的問題了,確實這是一個 known issue 但我發現還是有同學在詢問這個問題,所以在這裡給大家總結分享一下。
首先第一個問題 MessageBox顯示出來以後,如果用戶不理會 Message 頁面,大概等上10秒鐘程序就會自動退出。(這個現象在Debug時不會出現)
先簡單分析一下這個問題的原因,首先為什麼在Debug的時候應用不會出問題,很簡單我們在調試應用的時候很有可能一個斷點停留10秒鐘以上(一個返回值阻塞主線程),然而應用在非Debug的情況下出現這種現象,SDK會認為你的代碼有問題會強制退出。
升級到WP8必需知道的13個特性 系列文章目錄地址:http://www.linuxidc.com/Linux/2013-08/89003.htm
其實解決這個問題的方法很簡單,既然知道這個問題的原因了,使用一個異步方法(線程)來實解決這個問題。
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { e.Cancel = true; base.OnBackKeyPress(e); this.Dispatcher.BeginInvoke(delegate { if (MessageBox.Show("是否要退出程序?", "退出", MessageBoxButton.OKCancel) == MessageBoxResult.OK) { } }); }
當然肯定有同學會問 在調用MessageBox之前先把 e.Cancel 設置成 True 了那怎麼退出應用呢? 這也算是一個老問題了(WP7時代遺留問題),這裡我也是總結一下經驗,從網上看到的一些方法。
Windows Phone 8 更新 此方法可以直接終結應用。
Application.Current.Terminate();
但是此方法這裡不會調用頁面的 OnNavigatedFrom 事件 和App中的Application_Closing 事件,所以在調用此方法前要注意保存用戶數據。
Windows Phone 7
首先 XNA中的Game.Exit() 不建議使用因為在應用商店審核的時候會遇到問題,導致不能上商店。
目前唯一的靠譜方法就是通過拋異常並且在App文件中的Application_UnhandledException事件中處理它:
網絡上拋出異常的方式有兩種
1. 自定義的異常
private class QuitException : Exception { } public static void Quit() { throw new QuitException(); } // Code to execute on Unhandled Exceptions private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) { if (e.ExceptionObject is QuitException) return; if (System.Diagnostics.Debugger.IsAttached) { // An unhandled exception has occurred; break into the debugger System.Diagnostics.Debugger.Break(); } }
最後使用App.Quit()退出應用。
2. 利用 NavigationService.GoBack();退出應用
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { e.Cancel = true; base.OnBackKeyPress(e); this.Dispatcher.BeginInvoke(delegate { if (MessageBox.Show("是否要退出程序?", "退出", MessageBoxButton.OKCancel) == MessageBoxResult.OK) { while (NavigationService.BackStack.Any()) { NavigationService.RemoveBackEntry(); } NavigationService.GoBack(); } }); }
同理,在 Application_UnhandledException 中處理一下這個異常。
Windows Phone & Windows 8 Push Notification from Windows Azure
Windows Phone 處理 MessageBox導致的應用異常退出以及使用代碼方式退出應用
使用 Nokia Imaging SDK 開發有濾鏡功能的 Windows Phone 8 應用
在Windows Phone Store 商店中提交你的 Windows Phone 8 應用
Windows Phone 8 語音 - Speech for Windows Phone 8
Windows Phone 8 鏡頭應用 - Lenses for Windows Phone 8