Windows Phone7退出對話框的一點心得


 

 

首先問題是,何時調用?

 

根據我的經驗,在按下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;   

           }

 

       }

這樣就大功告成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章