Win10/UWP開發—SystemNavigationManager

Win10系統爲確保全部應用中的一致導航體驗,提供後退導航功能。當你的應用在手機、平板電腦上或者在支持系統後退功能的電腦或筆記本電腦上運行時,系統會在"後退"按鈕被按下時通知你的應用。 由你來決定要將哪些導航操做添加到導航歷史記錄以及應用如何響應後退按鈕按下操做。參閱 UWP 應用的導航設計基礎知識 以獲取有關導航歷史記錄和後退行爲的建議。windows

 

下面是每一個通用 Windows 平臺 (UWP) 設備類型提供的後退功能的分解狀況:app

電話spa

Win10/UWP開發—系統級導航 - Aran - 1

  • 始終存在。
  • 顯示在屏幕底部。
  • 提供應用內和應用間的後退導航。

平板電腦設計

Win10/UWP開發—系統級導航 - Aran - 2

  • 始終存在(當 Windows 處於平板電腦模式時)。(平板電腦用戶可在平板電腦模式下運行與在桌面模式下運行之間切換)。
  • 顯示在屏幕底部。
  • 提供應用內和應用間的後退導航。

電腦、筆記本電腦和 Surface Hub3d

Win10/UWP開發—系統級導航 - Aran - 3

  • 默認處於禁用狀態。開發人員能夠選擇啓用它。
  • 顯示在應用的標題欄中。
  • 僅在應用內提供後退導航。不提供應用間的導航。

咱們接下來要作的事情就是當設備類型爲電腦、筆記本或Surface Hub的時候,開啓系統後退導航按鈕並響應系統後退導航事件。code

首先咱們新建一個UWP通用App項目,暫且起名爲:NavBackButtonSample對象

訂閱後退導航按鈕點擊事件

打開App.cs文件,在OnLaunched事件中Frame對象初始化完畢後訂閱SystemNavigationManager的BackRequested事件:blog

SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;

經過SystemNavigationManager.GetForCurrentView()方法咱們能獲得SystemNavigationManager對象,而後訂閱對象的BackRequested事件,咱們就能夠在點擊後退導航按鈕時捕捉到該動做,從而在事件方法內部實現本身的邏輯。事件

響應後退導航按鈕

 1 private void App_BackRequested(object sender, BackRequestedEventArgs e)
 2 {
 3     // 這裏面能夠任意選擇控制哪一個Frame 
 4     // 若是MainPage.xaml中使用了另外的Frame標籤進行導航 可在此處獲取須要GoBack的Frame
 5     var rootFrame = Window.Current.Content as Frame;
 6  
 7     // ReSharper disable once PossibleNullReferenceException
 8     if (!rootFrame.CanGoBack) return;
 9     rootFrame.GoBack();
10 }

首先咱們須要獲取到須要GoBack的Frame對象,注意,若是咱們在App的頁面中又使用了另外的Frame元素進行導航的話須要獲取實際進行導航的Frame對象來進行操做。而後判斷是否能夠goback後進行goback。開發

完成上面這些操做後,系統的導航按鈕就具有了響應咱們的點擊事件,可是還有一件事情,PC、筆記本、Surface Hub的系統導航按鈕默認是隱藏的,咱們還須要使其顯示出來,須要注意的是,在程序剛剛打開導航到首頁或者從其餘深層頁面GoBack到首頁時,咱們須要隱藏系統導航按鈕。

開啓顯示導航按鈕

在App的OnLaunched事件中,咱們訂閱Frame的Navigated事件,Frame在每次作導航後,咱們須要判斷系統後退按鈕是否顯示(後退到首頁時,系統後退按鈕應該處於隱藏狀態)。

//訂閱導航完成時事件
rootFrame.Navigated += RootFrame_Navigated;

在Frame的Navigated事件中,判斷App的Frame的導航堆棧中是否存在元素,若是存在元素就顯示後退導航按鈕,若是不存在元素則說明App目前處於首級Page,咱們隱藏按鈕:

1 private void RootFrame_Navigated(object sender, NavigationEventArgs e)
2 {
3     // 每次完成導航 肯定下是否顯示系統後退按鈕
4     // ReSharper disable once PossibleNullReferenceException
5     SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
6         (Window.Current.Content as Frame).BackStack.Any()
7         ? AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;
8 }

在判斷Frame導航堆棧是否具備元素時,咱們默認是獲取的Windows.Current.Content對象爲Frame。

經過上面的設置,咱們的App的左上角在進行一次跳轉後就會出現系統的後退導航按鈕,此時咱們點擊該按鈕系統就會進行一次Navigation GoBack的操做。

而後作完上面的操做還不夠,雖然在PC、筆記本、surface hub設備上咱們的代碼運行起來是沒問題的,但是當設備更改成平板電腦或者Phone時,當咱們按下系統後退鍵,App會直接被退出。這是由於咱們在SystemNavigationManager對象的BackRequested事件中沒有對是否退出App作攔截。在BackRequested事件中作完rootFrame.GoBack();後添加e.Handled = true;更改後的代碼以下:

private void App_BackRequested(object sender, BackRequestedEventArgs e)
{
    // 這裏面能夠任意選擇控制哪一個Frame 
    // 若是MainPage.xaml中使用了另外的Frame標籤進行導航 可在此處獲取須要GoBack的Frame
    var rootFrame = Window.Current.Content as Frame;
 
    // ReSharper disable once PossibleNullReferenceException
    if (!rootFrame.CanGoBack) return;
    rootFrame.GoBack();
    // 設置指示應用程序已執行請求的後退導航操做
    e.Handled = true;
}

效果圖:

相關文章
相關標籤/搜索