2010年11月30日 星期二

離開 Page 時保存資料的方法

在 Charles Petzold 的 Windows Phone 7 電子書中有提到下面幾點

Let’s nail down some terminology that’s consistent with some events I’ll discuss later
1When an application is run from the Start screen, it is said to be launched.
2When an application is terminated as a result of the Back button, it is closed.
3When the program is running and the user presses the Start button, the program is said to be deactivated, even though it really is quite dead. This is the tombstoned state.
4When a program comes out of tombstoning as the user navigates back to it, it is said to be activated, even though it’s really starting up from scratch.

實際寫兩頁 PhoneApplicationPage 來交替開關就可以發現這些規則,
在按了 Back 鍵離開某個 Page 時,或使用 NavigationService 到某頁時,
離開的那個 Page 都會進到 tombstoned 的狀態,意即此 Page 所有變數都會被回收,
雖然 Page 消失了,但該 App 的 Service 其實還是存在的,
所以我們可以在 Page 的 NavigatedFrom 事件產生時,記下必要的資訊,
等待該頁再次被喚醒、接獲 NavigatedTo 事件時再利用這些資訊將畫面還原,
舉一個簡單的例子,假設我們做了一個看台股走勢圖的 App
在個股列表中點了某支個股後會開啟個股瀏灠頁供用戶觀看該股票的走勢圖,
這時我們可能想按 Back 鍵回到列表頁或 App 首頁看一下目前台股大盤多少點,
瞄個一眼就要再回到現正瀏灠的個股走勢圖頁面繼續看今天的走勢如何,
若要再讓用戶重新點選該股進到瀏灠頁再次從頭讀取一次走勢圖資料也無不可,
但若我們試著在 App 首頁的某處放一個現正瀏覽的按鍵感覺流程好像有變得更順暢,
這時我們可以在個股的走勢圖瀏灠頁利用剛才提過的 App Service 來保存資料


// 記得使用 Phone.Shell
using Microsoft.Phone.Shell;

StockInfo m_siCurrent; // 現正瀏覽的個股資訊

protected override void OnNavigatedFrom(NavigationEventArgs args)
{
  // 當離開此頁時,儲存下目前正在看的個股資訊,以便用戶回到此頁時重新載入資料
  PhoneApplicationService.Current.State["CurrentStock"] = m_siCurrent;
  base.OnNavigatedFrom(args);
}

protected override void OnNavigatedTo(NavigationEventArgs args)
{
  // Retrieve Current StockInfo
  if (PhoneApplicationService.Current.State.ContainsKey("CurrentStock"))
  {
    // 檢查是否有 CurrentStock 這個記錄值,有則讀出來並轉型
    m_siCurrent = (StockInfo)PhoneApplicationService.Current.State["CurrentStockID"];
    UpdateStockPanel();
  }
  base.OnNavigatedTo(args);
}


如果我們所撰寫的 WP7 App 只有一頁,這可能就不是必須學習的技巧,
其他情況 Navigated 事件的處理則是 WP7 程式寫作中相當重要的一部份。

剛才也有提過,在 Page 切換的時後 App Service 是一直存在的,
所以我們的資料可以利用 App Service 一直保存著,
但當用戶在 App MainPage 再使用 Back 鍵回到 WP7 主畫面時,
App Service 也就消失了,想保留生命週期更長的資料,請使用IsolatedStorage。

沒有留言:

張貼留言