Системный менеджер навигации

Последнее обновление: 13.02.2016

Universal Windows Platform предоставляет такой класс, как Windows.UI.Core.SystemNavigationManager, который позволяет реагировать на некоторые системные события навигации. Посмотрим, чем он может нам помочь.

Прежде всего через статический метод GetForCurrentView() мы можем получить объект SystemNavigationManager, который ассоциирован с текущим приложением. Получив данный объект, мы можем получить доступ к функционалу, который связан с навигацией. в частности, в SystemNavigationManager имеется свойство AppViewBackButtonVisibility, которое устанавливает видимость кнопки "Назад". По умолчанию она скрыта, но присвоив ей значение AppViewBackButtonVisibility.Visible, мы ее можем открыть:

Windows.UI.Core.SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
        Windows.UI.Core.AppViewBackButtonVisibility.Visible;

Кроме того, когда пользователь нажимает на эту кнопку, либо пытается перейти назад с помощью голосовой команды, у объекта SystemNavigationManager генерируется событие BackRequested. Мы его можем обработать данное событие, чтобы выполнить переход назад:

Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;
//.........................................................
private void App_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
{
    Frame frame = Window.Current.Content as Frame;
    if (frame.CanGoBack)
    {
        frame.GoBack(); // переход назад
        e.Handled = true; // указываем, что событие обработано
    }
}

Так как работа SystemNavigationManager относится в целом ко всему приложению, то соответственно все манипуляции с ним должны происходить в классе App. Так, в случае его применения содержимое файла App.xaml.cs может выглядеть таким образом:

using System;
using Windows.UI.Core;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using Windows.UI.ViewManagement;

namespace NavigationApp
{
    sealed partial class App : Application
    {
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }
        
        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;
            
            if (rootFrame == null)
            {
                rootFrame = new Frame();

                rootFrame.NavigationFailed += OnNavigationFailed;

                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                }
                
                Window.Current.Content = rootFrame;
            }

            if (rootFrame.Content == null)
            {
                rootFrame.Navigate(typeof(MainPage), e.Arguments);
            }
            
            Window.Current.Activate();

            // устанавливаем обработчик
            SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;
            rootFrame.Navigated += (s, args) =>
            {
                if (rootFrame.CanGoBack) // если можно перейти назад, показываем кнопку
                {
                    SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
                                            AppViewBackButtonVisibility.Visible;
                }
                else
                {
                    SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
                        AppViewBackButtonVisibility.Collapsed;
                }

            };
        }
        private void App_BackRequested(object sender, BackRequestedEventArgs e)
        {
            Frame frame = Window.Current.Content as Frame;
            if (frame.CanGoBack)
            {
                frame.GoBack();
                e.Handled = true;
            }
        }

        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
        }
        
        private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            deferral.Complete();
        }
    }
}

Стоит отметить, что нет смысла показывать копку Назад, например, на главной странице, если еще не было переходов, поэтому она раскрывается только, если в истории навигации уже есть просмотренные страницы. Причем для этого используется обработчик события Navigated объекта Frame. То есть при каждом переходе будет генерироваться данное событие, и в зависимости от наличия информации в истории переходов будет устанавливаться видимость кнопки.

И теперь после перехода по страницам мы сможем увидеть и использовать кнопку "Назад" в верхней панели приложения:

Кнопка Назад в приложении Universal Windows Platform
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850