Журнал навигации и навигация в обратном направлении для приложений Windows

Важные API: событие BackRequested, класс SystemNavigationManager, OnNavigatedTo

Приложения Windows обеспечивают единообразие навигации в обратном направлении в виде системы возврата на предыдущий уровень, позволяя пользователю перемещаться по журналу навигации в приложении и, в зависимости от устройства, из приложения в приложение.

Чтобы реализовать обратную навигацию в приложении, разместите кнопку "Назад" в верхнем левом углу пользовательского интерфейса приложения. Пользователь ожидает, что кнопка "Назад" перейдет к предыдущему расположению в журнале навигации приложения. Обратите внимание, что именно вы решаете, какие действия навигации добавлять в журнал навигации и как реагировать на нажатие кнопки "Назад".

Для большинства многостраничных приложений рекомендуем использовать элемент управления NavigationView, чтобы обеспечить платформу навигации для вашего приложения. Он адаптируется к различным размерам экрана и поддерживает оба типа панели навигации: верхнюю и левую. Если приложение использует NavigationView элемент управления, вы можете использовать встроенную кнопку навигации NavigationView.

Примечание.

Рекомендации и примеры, приведенные в этой статье, следует использовать при реализации навигации без применения элемента управления NavigationView. Если NavigationView применяется, эти сведения послужат полезной основой, но вы должны использовать конкретные рекомендации и примеры из статьи, посвященной NavigationView.

Кнопка "Назад"

Чтобы создать кнопку "Назад", используйте элемент управления Кнопка со стилем NavigationBackButtonNormalStyle и разместите кнопку в верхней левой части пользовательского интерфейса приложения (дополнительные сведения см. в примерах кода XAML ниже).

Кнопка

<Page>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Button x:Name="BackButton"
                Style="{StaticResource NavigationBackButtonNormalStyle}"
                IsEnabled="{x:Bind Frame.CanGoBack, Mode=OneWay}" 
                ToolTipService.ToolTip="Back"/>

    </Grid>
</Page>

Если в приложении есть верхняя панель commandBar, элемент управления Button, который имеет высоту 44epx, не будет выровняться с 48epx AppBarButtons очень хорошо. Однако, чтобы избежать несоответствия, выровняйте верхнюю часть элемента управления Button в границах 48epx.

Кнопка

<Page>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        
        <CommandBar>
            <CommandBar.Content>
                <Button x:Name="BackButton"
                        Style="{StaticResource NavigationBackButtonNormalStyle}"
                        IsEnabled="{x:Bind Frame.CanGoBack, Mode=OneWay}" 
                        ToolTipService.ToolTip="Back" 
                        VerticalAlignment="Top"/>
            </CommandBar.Content>
        
            <AppBarButton Icon="Delete" Label="Delete"/>
            <AppBarButton Icon="Save" Label="Save"/>
        </CommandBar>
    </Grid>
</Page>

Чтобы свести к минимуму перемещение элементов пользовательского интерфейса в приложении, отображайте кнопку "Назад" отключенной, если стек переходов назад пуст (IsEnabled="{x:Bind Frame.CanGoBack, Mode=OneWay}"). Но если предполагается, что ваше приложение никогда не будет иметь стека переходов назад, вам вообще не нужно отображать кнопку "Назад".

Состояния кнопки

Оптимизация для различных устройств и методов ввода

Это руководство по реализации навигации в обратном направлении применимо ко всем устройствам, но пользователям будет удобнее, если вы оптимизируете ее для различных форм-факторов и методов ввода.

Чтобы оптимизировать пользовательский интерфейс, сделайте следующее:

  • Рабочий стол или концентратор. Нарисуйте кнопку "Назад в приложении" в левом верхнем углу пользовательского интерфейса приложения.
  • Режим планшета: на планшетах может присутствовать кнопка аппаратного или программного обеспечения, но мы рекомендуем нарисовать кнопку назад в приложении для ясности.
  • Xbox/TV: не рисуйте кнопку назад; она добавит ненужный загроможден пользовательский интерфейс. Вместо этого используйте кнопку B игровой панели B, чтобы перейти назад.

Если ваше приложение будет выполняться на консоли Xbox, создайте пользовательский визуальный триггер для Xbox для переключения состояния видимости кнопки. Если вы используете элемент управления NavigationView, он будет автоматически переключать состояние видимости кнопки "Назад" при условии, что ваше приложение выполняется на консоли Xbox.

Для поддержки наиболее распространенных методов ввода для навигации в обратном направлении рекомендуем обрабатывать следующие события (в дополнение к событию Click кнопки "Назад").

Мероприятие Входные данные
CoreDispatcher.AcceleratorKeyActivated ALT + СТРЕЛКА ВЛЕВО,
VirtualKey.GoBack
SystemNavigationManager.BackRequested Клавиши WINDOWS+BACKSPACE,
Кнопка "B" на геймпаде,
кнопка "Назад" в режиме планшета,
Аппаратная кнопка "Назад"
CoreWindow.PointerPressed VirtualKey.XButton1
(Например, кнопка "Назад" на некоторых мышах.)

Примеры кода

В этом разделе показано, как обрабатывать навигацию в обратном направлении с помощью различных методов ввода.

Кнопка "Назад" и навигация в обратном направлении

Как минимум необходимо выполнить обработку события Click кнопки "Назад" и указать код для выполнения навигации в обратном направлении. Кроме того, при пустом стеке переходов назад кнопку "Назад" следует отключать.

В этом примере кода показано, как реализовать поведение навигации в обратном направлении с помощью кнопки "Назад". Код отвечает на событие Click этой кнопки переходом. Кнопка "Назад" включается или отключается в методе OnNavigatedTo, который вызывается при переходе на новую страницу.

Здесь показан код для MainPage, но этот код добавляется на каждую страницу, поддерживающую навигацию в обратном направлении. Чтобы избежать дублирования, можно разместить код, связанный с навигацией, в классе App на странице кода программной части App.xaml.*.

<!-- MainPage.xaml -->
<Page x:Class="AppName.MainPage">
...
        <Button x:Name="BackButton" Click="BackButton_Click"
                Style="{StaticResource NavigationBackButtonNormalStyle}"
                IsEnabled="{x:Bind Frame.CanGoBack, Mode=OneWay}" 
                ToolTipService.ToolTip="Back"/>
...
<Page/>

Поддерживающий код

// MainPage.xaml.cs
private void BackButton_Click(object sender, RoutedEventArgs e)
{
    App.TryGoBack();
}

// App.xaml.cs
//
// Add this method to the App class.
public static bool TryGoBack()
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame.CanGoBack)
    {
        rootFrame.GoBack();
        return true;
    }
    return false;
}
// MainPage.h
namespace winrt::AppName::implementation
{
    struct MainPage : MainPageT<MainPage>
    {
        MainPage();
 
        void MainPage::BackButton_Click(IInspectable const&, RoutedEventArgs const&)
        {
            App::TryGoBack();
        }
    };
}

// App.h
#include "winrt/Windows.UI.Core.h"
#include "winrt/Windows.System.h"
#include "winrt/Windows.UI.Input.h"
#include "winrt/Windows.UI.Xaml.Input.h"
 
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::UI::Core;
using namespace Windows::UI::Input;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;

struct App : AppT<App>
{
    App();

    // ...

    // Perform back navigation if possible.
    static bool TryGoBack()
    {
        Frame rootFrame{ nullptr };
        auto content = Window::Current().Content();
        if (content)
        {
            rootFrame = content.try_as<Frame>();
            if (rootFrame.CanGoBack())
            {
                rootFrame.GoBack();
                return true;
            }
        }
        return false;
    }
};

Поддержка клавиш доступа

Поддержка клавиатуры крайне важна для удобства работы пользователей с различными навыками, возможностями и ожиданиями. Рекомендуем реализовать поддержку сочетаний клавиш для навигации вперед и назад, так как пользователи, которые их применяют, будут рассчитывать на наличие сочетаний клавиш для обеих целей. Дополнительные сведения см. в статьях Взаимодействие с помощью клавиатуры и Сочетания клавиш.

Распространенные сочетания клавиш для навигации вперед и назад — ALT + СТРЕЛКА ВПРАВО (вперед) и ALT + СТРЕЛКА ВЛЕВО (назад). Чтобы обеспечить поддержку этих клавиш для навигации, обработайте событие CoreDispatcher.AcceleratorKeyActivated. Обрабатывается событие, которое находится непосредственно в окне (а не элемент на странице), поэтому приложение реагирует на сочетание клавиш независимо от того, какой элемент сейчас в фокусе.

Добавьте код в класс App, чтобы реализовать поддержку сочетаний клавиш и навигации вперед, как показано ниже. (Предполагается, что предыдущий код для поддержки кнопки "Назад" уже добавлен.) В конце раздела "Примеры кода" можно просмотреть весь App код.

// App.xaml.cs
// Add event handler in OnLaunced.
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    // ...
    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == null)
    {
        // ...
        // rootFrame.NavigationFailed += OnNavigationFailed;

        // Add support for accelerator keys. 
        // Listen to the window directly so the app responds
        // to accelerator keys regardless of which element has focus.
        Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated +=
            CoreDispatcher_AcceleratorKeyActivated;

        // ...

    }
}

// ...

// Add this code after the TryGoBack method added previously.
// Perform forward navigation if possible.
private bool TryGoForward()
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame.CanGoForward)
    {
        rootFrame.GoForward();
        return true;
    }
    return false;
}

// Invoked on every keystroke, including system keys such as Alt key combinations.
// Used to detect keyboard navigation between pages even when the page itself
// doesn't have focus.
private void CoreDispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs e)
{
    // When Alt+Left are pressed navigate back.
    // When Alt+Right are pressed navigate forward.
    if (e.EventType == CoreAcceleratorKeyEventType.SystemKeyDown
        && (e.VirtualKey == VirtualKey.Left || e.VirtualKey == VirtualKey.Right)
        && e.KeyStatus.IsMenuKeyDown == true
        && !e.Handled)
    {
        if (e.VirtualKey == VirtualKey.Left)
        {
            e.Handled = TryGoBack();
        }
        else if (e.VirtualKey == VirtualKey.Right)
        {
            e.Handled = TryGoForward();
        }
    }
}
// App.cpp
void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
    // ...
    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == nullptr)
    {
        // ...
        // rootFrame.NavigationFailed({ this, &App::OnNavigationFailed });

        // Add support for accelerator keys. 
        // Listen to the window directly so the app responds
        // to accelerator keys regardless of which element has focus.
        Window::Current().CoreWindow().Dispatcher().
            AcceleratorKeyActivated({ this, &App::CoreDispatcher_AcceleratorKeyActivated });

        // ...
    }
}

// App.h
struct App : AppT<App>
{
    App();

    // ...
    // Add this code after the TryGoBack method added previously.

private:
    // Perform forward navigation if possible.
    bool TryGoForward()
    {
        Frame rootFrame{ nullptr };
        auto content = Window::Current().Content();
        if (content)
        {
            rootFrame = content.try_as<Frame>();
            if (rootFrame.CanGoForward())
            {
                rootFrame.GoForward();
                return true;
            }
        }
        return false;
    }
 
 
    // Invoked on every keystroke, including system keys such as Alt key combinations.
    // Used to detect keyboard navigation between pages even when the page itself
    // doesn't have focus.
    void CoreDispatcher_AcceleratorKeyActivated(CoreDispatcher const& /* sender */, AcceleratorKeyEventArgs const& e)
    {
        // When Alt+Left are pressed navigate back.
        // When Alt+Right are pressed navigate forward.
        if (e.EventType() == CoreAcceleratorKeyEventType::SystemKeyDown
            && (e.VirtualKey() == Windows::System::VirtualKey::Left || e.VirtualKey() == Windows::System::VirtualKey::Right)
            && e.KeyStatus().IsMenuKeyDown
            && !e.Handled())
        {
            if (e.VirtualKey() == Windows::System::VirtualKey::Left)
            {
                e.Handled(TryGoBack());
            }
            else if (e.VirtualKey() == Windows::System::VirtualKey::Right)
            {
                e.Handled(TryGoForward());
            }
        }
    }
};

Обработка системных запросов на навигацию в обратном направлении

На устройствах Windows система может передать в приложение запрос навигации в обратном направлении разными способами. Некоторые распространенные способы: кнопка "B" на геймпаде, сочетание клавиш "WINDOWS + BACKSPACE", системная кнопка "Назад" в режиме планшета. Доступность конкретных вариантов зависит от устройства.

Вы можете реализовать поддержку запросов, отправляемых системой с помощью аппаратных и программных системных кнопок "Назад", зарегистрировав прослушиватель для события SystemNavigationManager.BackRequested.

Ниже приведен код, который следует добавить в класс App для поддержки запросов навигации в обратном направлении, отправляемых системой. (Предполагается, что предыдущий код для поддержки кнопки "Назад" уже добавлен.) В конце раздела "Примеры кода" можно просмотреть весь App код.

// App.xaml.cs
// Add event handler in OnLaunced.
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    // ...
    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == null)
    {
        // ...
        // Add support for accelerator keys. 
        // ... (Previously added code.)

        // Add support for system back requests. 
        SystemNavigationManager.GetForCurrentView().BackRequested 
            += System_BackRequested;

        // ...

    }
}

// ...
// Handle system back requests.
private void System_BackRequested(object sender, BackRequestedEventArgs e)
{
    if (!e.Handled)
    {
        e.Handled = TryGoBack();
    }
}
// App.cpp
void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
    // ...
    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == nullptr)
    {
        // ...
        // Add support for accelerator keys. 
        // ... (Previously added code.)

        // Add support for system back requests. 
        SystemNavigationManager::GetForCurrentView().
            BackRequested({ this, &App::System_BackRequested });

        // ...
    }
}

// App.h
struct App : AppT<App>
{
    App();

    // ...

private:
    // ...

    // Handle system back requests.
    void System_BackRequested(IInspectable const& /* sender */, BackRequestedEventArgs const& e)
    {
        if (!e.Handled())
        {
            e.Handled(TryGoBack());
        }
    }
};

Поведение системной кнопки "Назад" для обеспечения обратной совместимости

Ранее в приложениях UWP использовали SystemNavigationManager.AppViewBackButtonVisibility для отображения или скрытия системной кнопки "Назад" для навигации в обратном направлении. (Эта кнопка вызывает Событие SystemNavigationManager.BackRequested .) Этот API будет поддерживаться для обеспечения обратной совместимости, но мы больше не рекомендуем использовать кнопку "Назад", предоставленную AppViewBackButtonVisibility. Вместо этого следует реализовать собственную кнопку "Назад" в приложении, как описано в этой статье.

Если вы продолжите использовать AppViewBackButtonVisibility, системный пользовательский интерфейс отобразит системную кнопку "Назад" внутри заголовка окна. (Внешний вид и взаимодействие с пользователем для кнопки "Назад" не изменились по сравнению с предыдущими сборками.)

Кнопка

Работа с кнопками мыши для навигации

Некоторые мыши оснащены аппаратными кнопками для навигации вперед и назад. Вы можете обеспечить поддержку этих кнопок мыши, обрабатывая событие CoreWindow.PointerPressed и проверяя IsXButton1Pressed (назад) или IsXButton2Pressed (вперед).

Ниже приведен код, который следует добавить в класс App для поддержки навигации с помощью кнопок мыши. (Предполагается, что предыдущий код для поддержки кнопки "Назад" уже добавлен.) В конце раздела "Примеры кода" можно просмотреть весь App код.

// App.xaml.cs
// Add event handler in OnLaunced.
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    // ...
    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == null)
    {
        // ...
        // Add support for system back requests. 
        // ... (Previously added code.)

        // Add support for mouse navigation buttons. 
        Window.Current.CoreWindow.PointerPressed += CoreWindow_PointerPressed;

        // ...

    }
}

// ...

// Handle mouse back button.
private void CoreWindow_PointerPressed(CoreWindow sender, PointerEventArgs e)
{
    // For this event, e.Handled arrives as 'true'.
    if (e.CurrentPoint.Properties.IsXButton1Pressed)
    {
        e.Handled = !TryGoBack();
    }
    else if (e.CurrentPoint.Properties.IsXButton2Pressed)
    {
        e.Handled = !TryGoForward();
    }
}
// App.cpp
void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
    // ...
    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == nullptr)
    {
        // ...
        // Add support for system back requests. 
        // ... (Previously added code.)

        // Add support for mouse navigation buttons. 
        Window::Current().CoreWindow().
            PointerPressed({ this, &App::CoreWindow_PointerPressed });

        // ...
    }
}

// App.h
struct App : AppT<App>
{
    App();

    // ...

private:
    // ...

    // Handle mouse forward and back buttons.
    void CoreWindow_PointerPressed(CoreWindow const& /* sender */, PointerEventArgs const& e)
    {
        // For this event, e.Handled arrives as 'true'. 
        if (e.CurrentPoint().Properties().IsXButton1Pressed())
        {
            e.Handled(!TryGoBack());
        }
        else if (e.CurrentPoint().Properties().IsXButton2Pressed())
        {
            e.Handled(!TryGoForward());
        }
    }
};

Весь код, добавленный в класс App

// App.xaml.cs
//
// (Add event handlers in OnLaunched override.)
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    // ...
    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == null)
    {
        // ...
        // rootFrame.NavigationFailed += OnNavigationFailed;

        // Add support for accelerator keys. 
        // Listen to the window directly so the app responds
        // to accelerator keys regardless of which element has focus.
        Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated +=
            CoreDispatcher_AcceleratorKeyActivated;

        // Add support for system back requests. 
        SystemNavigationManager.GetForCurrentView().BackRequested 
            += System_BackRequested;

        // Add support for mouse navigation buttons. 
        Window.Current.CoreWindow.PointerPressed += CoreWindow_PointerPressed;

        // ...

    }
}

// ...

// (Add these methods to the App class.)
public static bool TryGoBack()
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame.CanGoBack)
    {
        rootFrame.GoBack();
        return true;
    }
    return false;
}

// Perform forward navigation if possible.
private bool TryGoForward()
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame.CanGoForward)
    {
        rootFrame.GoForward();
        return true;
    }
    return false;
}

// Invoked on every keystroke, including system keys such as Alt key combinations.
// Used to detect keyboard navigation between pages even when the page itself
// doesn't have focus.
private void CoreDispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs e)
{
    // When Alt+Left are pressed navigate back.
    // When Alt+Right are pressed navigate forward.
    if (e.EventType == CoreAcceleratorKeyEventType.SystemKeyDown
        && (e.VirtualKey == VirtualKey.Left || e.VirtualKey == VirtualKey.Right)
        && e.KeyStatus.IsMenuKeyDown == true
        && !e.Handled)
    {
        if (e.VirtualKey == VirtualKey.Left)
        {
            e.Handled = TryGoBack();
        }
        else if (e.VirtualKey == VirtualKey.Right)
        {
            e.Handled = TryGoForward();
        }
    }
}

// Handle system back requests.
private void System_BackRequested(object sender, BackRequestedEventArgs e)
{
    if (!e.Handled)
    {
        e.Handled = TryGoBack();
    }
}

// Handle mouse back button.
private void CoreWindow_PointerPressed(CoreWindow sender, PointerEventArgs e)
{
    // For this event, e.Handled arrives as 'true'.
    if (e.CurrentPoint.Properties.IsXButton1Pressed)
    {
        e.Handled = !TryGoBack();
    }
    else if (e.CurrentPoint.Properties.IsXButton2Pressed)
    {
        e.Handled = !TryGoForward();
    }
}


// App.cpp
void App::OnLaunched(LaunchActivatedEventArgs const& e)
{
    // ...
    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == nullptr)
    {
        // ...
        // rootFrame.NavigationFailed({ this, &App::OnNavigationFailed });

        // Add support for accelerator keys. 
        // Listen to the window directly so the app responds
        // to accelerator keys regardless of which element has focus.
        Window::Current().CoreWindow().Dispatcher().
            AcceleratorKeyActivated({ this, &App::CoreDispatcher_AcceleratorKeyActivated });

        // Add support for system back requests. 
        SystemNavigationManager::GetForCurrentView().
            BackRequested({ this, &App::System_BackRequested });

        // Add support for mouse navigation buttons. 
        Window::Current().CoreWindow().
            PointerPressed({ this, &App::CoreWindow_PointerPressed });

        // ...
    }
}

// App.h
#include "winrt/Windows.UI.Core.h"
#include "winrt/Windows.System.h"
#include "winrt/Windows.UI.Input.h"
#include "winrt/Windows.UI.Xaml.Input.h"
 
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::UI::Core;
using namespace Windows::UI::Input;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;

struct App : AppT<App>
{
    App();

    // ...

    // Perform back navigation if possible.
    static bool TryGoBack()
    {
        Frame rootFrame{ nullptr };
        auto content = Window::Current().Content();
        if (content)
        {
            rootFrame = content.try_as<Frame>();
            if (rootFrame.CanGoBack())
            {
                rootFrame.GoBack();
                return true;
            }
        }
        return false;
    }
private:
    // Perform forward navigation if possible.
    bool TryGoForward()
    {
        Frame rootFrame{ nullptr };
        auto content = Window::Current().Content();
        if (content)
        {
            rootFrame = content.try_as<Frame>();
            if (rootFrame.CanGoForward())
            {
                rootFrame.GoForward();
                return true;
            }
        }
        return false;
    }
  
    // Invoked on every keystroke, including system keys such as Alt key combinations.
    // Used to detect keyboard navigation between pages even when the page itself
    // doesn't have focus.
    void CoreDispatcher_AcceleratorKeyActivated(CoreDispatcher const& /* sender */, AcceleratorKeyEventArgs const& e)
    {
        // When Alt+Left are pressed navigate back.
        // When Alt+Right are pressed navigate forward.
        if (e.EventType() == CoreAcceleratorKeyEventType::SystemKeyDown
            && (e.VirtualKey() == Windows::System::VirtualKey::Left || e.VirtualKey() == Windows::System::VirtualKey::Right)
            && e.KeyStatus().IsMenuKeyDown
            && !e.Handled())
        {
            if (e.VirtualKey() == Windows::System::VirtualKey::Left)
            {
                e.Handled(TryGoBack());
            }
            else if (e.VirtualKey() == Windows::System::VirtualKey::Right)
            {
                e.Handled(TryGoForward());
            }
        }
    }

    // Handle system back requests.
    void System_BackRequested(IInspectable const& /* sender */, BackRequestedEventArgs const& e)
    {
        if (!e.Handled())
        {
            e.Handled(TryGoBack());
        }
    }

    // Handle mouse forward and back buttons.
    void CoreWindow_PointerPressed(CoreWindow const& /* sender */, PointerEventArgs const& e)
    {
        // For this event, e.Handled arrives as 'true'. 
        if (e.CurrentPoint().Properties().IsXButton1Pressed())
        {
            e.Handled(!TryGoBack());
        }
        else if (e.CurrentPoint().Properties().IsXButton2Pressed())
        {
            e.Handled(!TryGoForward());
        }
    }
};

Рекомендации по пользовательскому поведению навигации с обратной стороной

Если вы решили предоставить собственную навигацию по стеку заднего стека, интерфейс должен быть согласован с другими приложениями. Рекомендуется следовать следующим шаблонам действий навигации:

Действие навигации Добавьте в журнал навигации?
Со страницы на страницу, различные группы одноранговых элементов Да

На этом рисунке пользователь переходит с уровня 1 приложения на уровень 2, пересекая группы одноранговых узлов, поэтому навигация добавляется в журнал навигации.

Схема навигации по одноранговым группам, показывающая, что пользователь перемещается из группы один в группу, чтобы сгруппировать два и назад к группе.

На следующем рисунке пользователь перемещается между двумя одноранговых группами на одном уровне, снова пересекая одноранговые группы, поэтому навигация добавляется в журнал навигации.

Схема навигации по одноранговым группам, показывающая, что пользователь перемещается из группы один в группу, чтобы сгруппировать два, а затем сгруппировать три и вернуться в группу два.

Со страницы на страницу; одна и та же группа одноранговых элементов; элементы навигации не отображаются на экране

Пользователь переходит с одной страницы на другую с одной и той же группой одноранговых узлов. На экране отсутствует элемент навигации (например, NavigationView), обеспечивающий непосредственное перемещение между двумя страницами.

Да

На следующей иллюстрации пользователь перемещается между двумя страницами в одной группе одноранговых элементов и навигацию необходимо добавить в историю навигации.

Навигация в одноранговой группе

Со страницы на страницу; одна и та же группа одноранговых элементов; элементы навигации отображаются на экране

Пользователь перемещается с одной страницы на другую в той же группе одноранговых узлов. Обе страницы отображаются в одном и том же элементе навигации, например NavigationView.

Это зависит от обстоятельств

Да, добавить в журнал навигации с двумя исключениями. Если ожидается, что пользователи вашего приложения будут часто переключаться между страницами в одноранговой группе, или если вы хотите сохранить иерархию навигации, не добавляйте в журнал навигации. В этом случае, когда пользователь нажимает кнопку "Назад", выполните переход к последней странице, на которой он находился перед переходом к текущей одноранговой группе.

Навигация по группам одноранговых узлов при наличии элемента навигации

Используйте промежуточный пользовательский интерфейс

В приложении отображается всплывающее окно или дочернее окно, например диалоговое окно, экран-заставка или экранная клавиатура, или приложение входит в специальный режим, например несколько режимов выбора.

Нет

Когда пользователь нажимает кнопку "Назад", закройте временный пользовательский интерфейс (скрытие клавиатуры на экране, отмените диалоговое окно и т. д.) и вернитесь на страницу, которая породила временный пользовательский интерфейс.

Отображение временного пользовательского интерфейса

Перечисление элементов

Приложение отображает содержимое элемента экрана, например информацию о выбранном элементе в списке шаблона "Список и подробные сведения".

Нет

Перечисление элементов аналогично навигации в одноранговой группе. Когда пользователь нажимает назад, перейдите на страницу, которая предшествовала текущей странице с перечислением элементов.

Перечисление Iterm

Возобновление

Когда пользователь переключается на другое приложение и возвращается в приложение, рекомендуется вернуться на последнюю страницу в журнале навигации.