本篇介紹一下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 }; }
我們看到,這是有一個條件編譯符 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 中的頁面導航相關知識介紹完了,希望對大家有幫助,謝謝。