首先問題是,何時調用?
根據我的經驗,在按下Back鍵的時候程序會收到一個事件:
1. 如果是App類
在VS生成的代碼中有一個InitializePhoneApplication函數,在裏面創建了RootFrame對象,這個對象有一個事件BackKeyPress,添加一個函數響應它,按下Back鍵的時候這個函數會被響應,比如:
private void OnBackKeyPress(object sender,System.ComponentModel.CancelEventArgs e)
{
}
RootFrame.BackKeyPress += OnBackKeyPress;
2. 如果是根頁面
在MainPage中就是OnBackKeyPress虛函數,你可以override它,按下Back鍵的時候這個函數會被響應。函數如下:
protected override voidOnBackKeyPress(System.ComponentModel.CancelEventArgse)
{
}
這兩個函數都有一個CancelEventArgs對象,這個對象是很重要的,它決定了當前的Back操作是否有效。
接下來就是判斷程序是否當前按下Back鍵的時候程序將要退出了,這個時候我們應該檢查一下BackStack,看看是否還有回退的可能
如果是App.xaml.cs,這樣調用
If((RootVisual as RootFrame).CanGoBack ==false)
{
}
如果是MainPage.xaml.cs,這樣調用
if (NavigationService.CanGoBack == false)
{
}
接下來的問題就是如何彈出對話框,這裏面又有兩種方式,其中Silverlight的方式比較簡單,但是效果差一點,XNA的方式稍微有些繁瑣,但是效果比較好。
首先談談Silverlight的方式
這種方式下我們一般調用MessageBox.Show來顯示對話框,關於這個函數我就不多講了,很簡單的用法,只是用這個方式彈出的對話框沒有聲音,也沒有震動的效果,所以我主要談談XNA對話框的實現。
XNA方式下,調用的是Guide.BeginShowMessageBox函數,這個函數在彈出的時候,會播放一個提示音,並且震動一下手機,但是不幸的是,它是一個異步函數,換而言之,如果你在OnBackKeyPress中調用了這個函數,對話框會顯示出來,但是程序會繼續執行,然後就退出了,爲了解決這個問題,我寫了這樣一個類,QuitMessageBox,代碼如下:
using System.Windows;
usingMicrosoft.Xna.Framework.GamerServices;
namespace WindowsPhoneApplication1
{
public class QuitMessageBox
{
private static int _shouldExit = -1;
public static MessageBoxResult Show(string title, string content)
{
Guide.BeginShowMessageBox(title, content, new string[] { "確定","取消" }, 0, MessageBoxIcon.Alert, asyncResult =>
{
int? returned =Guide.EndShowMessageBox(asyncResult);
if (returned == 0)
{
_shouldExit = 1;
}
else
{
_shouldExit = 0;
}
}, null);
while (true)
{
if (_shouldExit == 1)
{
return MessageBoxResult.OK;
break;
}
else if (_shouldExit == 0)
{
_shouldExit = -1;
return MessageBoxResult.Cancel;
break;
}
System.Threading.Thread.Sleep(1);
}
}
}
}
調用形式爲QuitMessageBox.Show(string title,string content);
該函數返回兩個值,如果是MessageBoxResult.OK,表示點了確定,如果是MessageBoxResult.Cancel就表示點了取消
這時候我們就可以放在OnBackKeyPress裏了,可以這樣寫:
protected override voidOnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
if (NavigationService.CanGoBack == false)
{
if (QuitMessageBox.Show("提示","確定退出嗎?") == MessageBoxResult.Cancel)
e.Cancel = true;
}
}
這樣就大功告成了。