本篇介紹一下Windows Phone 8.1 中頁面導航的實現方式。
大家對Windows Phone 8 中頁面導航的實現一定不陌生,我們使用 NavigationService 來實現。具體寫法是這樣的:
NavigationService.Navigate(new Uri("XAML相對路徑", UriKind.RelativeOrAbsolute));
而在導航目標頁,我們在 OnNavigatedTo 方法中通過 NavigationContext.QueryString["key"] 來接收頁面傳遞的參數。
當按下回退鍵時,導航源頁面會被從回退棧中取出顯示,這樣我們就完成了一個完整的頁面導航過程。
而在Windows Phone 8.1 中,導航方式有所不同,首先我們需要在導航源頁面做如下處理:
Frame.Navigate(typeof(NavigationDemoPage), null);
我們利用到了Page內容控制Frame的Navigate方法,它有兩個參數,第一個參數是導航目標頁的類型,第二個參數(可選)為頁面間傳遞的參數。
而在目標頁,我們通過 NavigationHelper 來完成接受參數和其他處理。當我們在項目中建立一個基本頁(BasicPage)時,Common檔案夾中會出現NavigationHelper類和其他一些輔助類。
NavigationHelper 有兩個很重要的事件 LoadState 和 SaveState,分別用來載入儲存狀態和儲存當前頁的狀態。而接收導航參數就會用到LoadState 事件,來看看我們在它的註冊方法中的處理:
private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e){ var param = e.NavigationParameter;}
與Windows Phone 8中可傳遞多個字串參數不同的是,8.1 中導航參數只有一個,而且是object 類型,這也就是說我們可以傳遞包括字串在內的很多自訂類型,這在參數傳遞和使用上無疑方便了很多。
在按下回退鍵時,頁面返回到導航源。而如果我們沒有使用NavigationHelper 的話,頁面是沒有辦法正常回退的,這是怎麼回事呢,我們來看看NavigationHelper 的建構函式吧:
public NavigationHelper(Page page) { this.Page = page; // 當此頁是視覺化樹狀結構的一部分時,進行兩個更改: // 1) 將應用程式檢視狀態映射到頁的可視狀態 // 2) Handle hardware navigation requests this.Page.Loaded += (sender, e) => {#if WINDOWS_PHONE_APP Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;#else // 僅當佔用整個視窗時,鍵盤和滑鼠導航才適用 if (this.Page.ActualHeight == Window.Current.Bounds.Height && this.Page.ActualWidth == Window.Current.Bounds.Width) { // 直接偵聽視窗,因此無需焦點 Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += CoreDispatcher_AcceleratorKeyActivated; Window.Current.CoreWindow.PointerPressed += this.CoreWindow_PointerPressed; }#endif }; // 當頁不再可見時,撤消相同更改 this.Page.Unloaded += (sender, e) => {#if WINDOWS_PHONE_APP Windows.Phone.UI.Input.HardwareButtons.BackPressed -= HardwareButtons_BackPressed;#else Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated -= CoreDispatcher_AcceleratorKeyActivated; Window.Current.CoreWindow.PointerPressed -= this.CoreWindow_PointerPressed;#endif }; }
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/
我們看到,這是有一個條件編譯符 WINDOWS_PHONE_APP。在使用了NavigationHelper 的Page 中,Loaded 和 UnLoaded 事件處理代碼中都加入了Windows.Phone.UI.Input.HardwareButtons.BackPressed 的處理,這就是對硬體回退按鈕點擊的響應,響應事件如下:
private void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e) { if (this.GoBackCommand.CanExecute(null)) { e.Handled = true; this.GoBackCommand.Execute(null); } }
public RelayCommand GoBackCommand { get { if (_goBackCommand == null) { _goBackCommand = new RelayCommand( () => this.GoBack(), () => this.CanGoBack()); } return _goBackCommand; } set { _goBackCommand = value; } }
我們看到,事件的處理中執行了GoBackCommand 來導航到導航曆史中的最新項。
最有還有一點要說明,Windows Phone 8.1 中,頁面導航回退時,導航源頁面會重新Load,對於需要載入資料等的頁面,這種重新載入的結果並不是我們想看到的。
這裡我們可以使用 NavigationCacheMode 來避免這一現象,我們在頁面構造方法中對它進行設定,它是一個枚舉類型,有三種枚舉值:
Disabled 不快取頁面面,導航返回時重新載入頁面
Required 快取頁面面,且不考慮緩衝大小
Enabled 快取頁面面,但是當超過緩衝大小的限制時,放棄緩衝。
好了,到這裡我們就把Windows Phone 8.1 中的頁面導航相關知識介紹完了,希望對大家有協助,謝謝。