Windows Phone 8.1 新特性 - 頁面導航


本篇介紹一下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 中的頁面導航相關知識介紹完了,希望對大家有幫助,謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM