2013年3月20日 星期三

Windows Phone改寫回上一頁的行為

因為PhoneGap天生侷限,對換頁反應比較遲鈍,因此地鐵暗棋所有頁面轉換都在同個檔案的canvas上進行。而這麼做雖然有效避免頁面切換的延遲時間,但也會造成一些問題,主要是回上一頁的預設行為與我們預期將不再相符。

譬如說我們希望不論身處何處,只要按上一頁的按鈕,都能回到程式主頁,但系統並不知曉程式還有頁面之分,所以會一律跳回Live Title頁面,導致程式結束。

所幸,我們可以藉由改寫回上一頁的行為,來達到符合預期的頁面切換。PhoneGap有提供回上一頁的API,在Android系統上可直接呼叫使用,但並沒有很好的支援Windows Phone 7,因此還是直接修改原始碼會比較具有彈性。簡易流程如下:

1. 我們可利用InvokeScript()容易丟出例外的特性,在任一js檔撰寫一個回上一頁的function:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 進行回到上一頁的處理
function goBack()
{
    if ( isStartPageNow() )
    {
        navigator.app.exitApp(); // 以InvokeScript執行此句會造成例外
    }
    else
    {
        showPage( START_PAGE ); // 秀出開始頁面
    }
}



2. 開啟專案中的CordoveView.xaml.cs,修改page_BackKeyPress():

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
void page_BackKeyPress( object sender, CancelEventArgs e )
{
    try
    {
        CordovaBrowser.InvokeScript( "goBack", "" ); // 若有例外發生代表正處於開始頁面
        e.Cancel = true; // 取消預設回到上一頁的行為
        return;
    }
    catch ( Exception ex )
    {
        // 代表正處在開始頁面,故不處理繼續執行,以結束程式。
    }
    
    // ------ 以下程式碼不動 ------



3. 重編譯後即可見到效果。

沒有留言:

張貼留言