Windows Phone 8.1新特性之頁面導航

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.