標籤:style blog http color 使用 strong 檔案 io
第二章:應用程式模型和導航(2)
本章核心問題:
- 應用程式的生命週期
- 微軟基於頁面的Silverlight應用程式架構的導航模型
上一篇我們討論了WP的運作機制,現在我們接著討論,談談WP的恢複策略:
在WP7.X中,當我們返回應用程式(沒有退出),然後再次啟用應用程式時,通過上一篇文章我們可以知道它是按照系統中儲存的墓誌狀態來進行恢複,這個過程比較緩慢。在WP8中微軟為我們引入了一種新的技術-恢複策略(resume policy),這使得應用程式恢複的速度更快。這一策略的使用使得應用程式儲存棧中有當前退出應用程式的執行個體,當我們切換回來的時候就會直接調用該對象的執行個體,從而顯得響應速度比較快。
當程式前台運行過程中,我們按視窗鍵會把程式切換到後台。這時候,wp8預設的快速恢複方法是長按後退鍵,而我們再點擊ShellTile或主程式磁貼或程式列表表徵圖運行程式時,程式會先跳轉到曆史頁面堆棧的最新頁面,跳轉參數e.NavigationMode == NavigationMode.Reset,然後自動執行新跳轉到程式預設啟動頁或者ShellTile指定的頁面,再清理掉曆史頁面堆棧。
所以,為了在執行點擊主程式磁貼或程式列表表徵圖運行程式時也快速恢複到最後瀏覽頁面,我們需要把後面自動執行的新跳轉取消掉,並且保留曆史頁面堆棧:
1.我們需要Properties->WMAppManifest.xml
圖1-1:設定恢複策略
<DefaultTask Name ="_default" NavigationPage="MainPage.xaml" ActivationPolicy="Resume"/>
NavigationPage:設定程式的啟動頁
2.修改App.xaml.cs檔案的CheckForResetNavigation方法如下:
private bool _isResume = false;//每次頁面跳轉完成時都執行,這裡判斷是否為復原模式private void CheckForResetNavigation(object sender, NavigationEventArgs e){ //當前為程式快速恢複到最後瀏覽頁面時,這之後架構將進行自動跳轉到程式預設啟動頁或ShellTile指定頁 if (e.NavigationMode == NavigationMode.Reset) { //快速恢複時,決定是否取消架構的自動跳轉 RootFrame.Navigating += HandlerFotResetNavigating; _isResume = true; } else { if (_isResume && e.NavigationMode == NavigationMode.Refresh) //第二次點擊相同磁貼而觸發的快速恢複時,不會執行架構自動跳轉 { RootFrame.Navigating -= HandlerFotResetNavigating; _isResume = false; } }}
3、實現HandlerFotResetNavigating事件:
//快速復原模式時的架構自動跳轉,這裡決定是否取消該跳轉private void HandlerFotResetNavigating(object sender, NavigatingCancelEventArgs e){ RootFrame.Navigating -= HandlerFotResetNavigating; if (e.Uri.OriginalString.Contains("MainPage.xaml")) //點擊程式主磁貼或程式列表表徵圖進入,會跳轉到預設程式啟動頁面,則取消該跳轉,恢複到曆史頁面堆棧最新頁面 { e.Cancel = true; } else //點擊ShellTile進入,會跳轉ShellTile指定的頁面,則不取消該跳轉,並且在跳轉完成後清除曆史堆棧 { RootFrame.Navigated += ClearBackStackAfterReset; } _isResume = false;}
二、頁面導航模型
WP的導航模型類似於傳統的WEB導航(頁面間的跳轉,採用URL的方式導航,也可以由一個應用程式導航到另一個應用程式),通常WP的頁面數量保持在4-10之間,也可以有更多的頁面,相應地也就要消耗更多的系統資源。
圖1-1:WP頁面導航模型
PS:這種導航過程可以認為是入棧和出棧,結合瀏覽器的前進後退原理很好理解這個過程。
WP這種頁面->應用,應用->頁面的導航模型創造了無縫的使用者體驗。