構建基於WinRT的WP8.1 App 01:頁面導航及頁面緩存模式

本篇博文主要闡述基於Windows Runtime的Windows Phone 應用頁面間導航相關知識,主要分爲如下幾個方面: windows

  • Window、Frame和Page概覽
  • 頁面間實現跳轉
  • 處理物理後退鍵
  • 頁面的緩存

Window、Frame和Page概覽 瀏覽器

基於WinRT的Windows Phone 8.1,每一個App只有一個Window。 緩存

每一個Window都有本身的Frame和導航棧, 以及本身的Page。 app

Window中有一個Frame,而且100%撐滿可視區域,一般Frame也是100%撐滿Window的可視區域。 框架

全部的Page都被包含在Frame中,Frame負責頁面間的導航。Page中包含的就是本身的內容了,包括Xaml文件和相關聯的code-behind代碼。 函數

雖然應用的窗口通常都只會包含一個Frame,可是咱們能夠經過在Page中嵌入Frame,可是這種狀況在手機應用上並不常見。 ui

 

 

 

 

一般Frame在應用啓動時建立,能夠參考下面代碼: spa

來簡單分析一下上述代碼,OnLaunched函數存在於App.xaml.cs文件中,包含一些啓動的邏輯代碼。OnLaunched函數中將Frame對象當前Window中,而後調用Frame.Navigate(Type,object)函數,建立一個Page的實例,並把Page放進Frame中。當向前或向後跳轉Page時,Frame會記錄跳轉的歷史,能夠經過Frame.BackStack屬性(返回類型:IList<PageStackEntry>)查看跳轉導航的歷史。 3d

頁面間實現跳轉 code

當須要跳轉到另外一個頁面時,調用Frame的Navigate函數。該函數把當前頁面放到後退棧中,而且能夠傳遞任何參數給新的頁面。

 

 

 

 

 

另外咱們能夠在頁面中放置Buttons, hyperlinks, appbar buttons 或者其餘控件,經過代碼移除當前Page,讓用戶跳轉回到以前的頁面。咱們能夠利用Frame.GoBack()函數實現。

下面來分析具體實現的原理:一般Windows Phone應用會維護一個跳轉的歷史棧,就像Web瀏覽器同樣。應用一般啓動至MainPage.xaml,因此它是棧的第一個項,當跳轉到SecondPage.xaml後,SecondPage.xaml就被放進棧中,當調用Frame.GoBack時,SecondPage就會被從棧中彈出來,而後回到MainPage。

處理物理後退鍵

基於Silverlight的Windows Phone 用戶體驗中一個典型的特性是:當用戶按下Back鍵時,用戶知道這樣會取消當前視圖並回到以前的視圖。在Windows Phone Silverlight中,物理Back鍵會引發App內部的向回跳轉。若是用戶當前在啓動頁面,基於Silverlight框架的Windows Phone App會被關閉。

而在基於Windows Runtime的Windows Phone App中,行爲稍微有點不同,默認狀況下按下物理Back鍵會引發向後跳轉到以前的App,而跟用戶當前在哪一個App的頁面上沒有關係。所以開發者須要重寫這種默認的行爲讓它在App內部跳轉。另外,若是用戶在App的啓動頁面,按下物理Back鍵會引發跳轉到以前的App,可是與Silverlight框架不一樣的是當前的App是被掛起,而不是被關閉

關於上述的內容,那麼咱們該如何對Back鍵進行處理呢?

若是使用空項目模板,那麼新建的項目文件中沒有任何Back鍵的處理代碼,若是想實現簡單的後退跳轉,能夠利用下面代碼。

上述代碼中,在App.xaml.cs文件中重寫了BackPressed事件,在BackPressed事件中判斷是否能夠向前進行跳轉,若是能夠,返回到前一個頁面。

若是使用非空項目模板進行建立項目(例如:Hub App或者Pivot App),新建的項目以及包含了正確的Back鍵處理,咱們能夠在項目的Common文件夾中的NavigationHelper類中找到相應處理函數。

另外也能夠在某一個頁面上單獨處理Back鍵,具體處理方法和上述代碼相似,這裏就再也不累贅重述了。

頁面的緩存

首先咱們來描述一個經常使用場景:當用戶第一次訪問某個頁面時,頁面是新的,沒有數據帶入。用戶與頁面交互,會填充一些數據。當向前導航到另外一個頁面而後再導航回來。一般用戶指望頁面和離開時是同樣的狀態。那麼咱們該如何保證頁面和離開時是同樣的狀態呢?

咱們能夠利用Page的NavigationCacheMode屬性。

當使用NavigationCacheMode.Disabled時,向前跳轉時建立一個新的實例,原始頁面的狀態丟失。

當使用NavigationCacheMode.EnabledRequired時,緩存的頁面能夠重用,原始頁面的狀態保留。

下面詳細描述一下NavigationCacheMode屬性三個值的做用:

  • NavigationCacheMode.Disabled:無論向回仍是向前跳轉都會生成頁面新的實例;
  • NavigationCacheMode.Enabled:頁面被緩存,可是達到緩存上限時,緩存的實例仍是會被丟棄(上限由Frame.CacheSize屬性決定,默認狀況下爲10);
  • NavigationCacheMode.Required:頁面被緩存,而且緩存的實例不受數量限制;

另外也可使用NavigationHelper類保存/恢復頁面狀態。一般咱們在Page的OnNavigatedTo函數事件中調用NavigationHelper的LoadState函數恢復頁面狀態,在Page的OnNavigatedFrom函數事件中調用NavigationHelper的SaveState函數保存頁面狀態。

參考文章

相關文章
相關標籤/搜索