Перейти к содержимому

Как сделать кнопку назад в wpf

  • автор:

Перемещение кнопки по форме мышью в WPF

В WPF идея такая же: запоминать точку клика и двигать по дельте. Нюанс в том, что контролы имеют абсолютные координаты только внутри Canvas (ну или с помощью отступов).

MainWindow.xaml

MainWindow.xaml.cs

using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace MouseMovableControl < public partial class MainWindow < private Point? _movePoint; public MainWindow() =>InitializeComponent(); private void Btn_OnMouseDown(object sender, MouseButtonEventArgs e) < _movePoint = e.GetPosition(btn); btn.CaptureMouse(); >private void Btn_OnMouseUp(object sender, MouseButtonEventArgs e) < _movePoint = null; btn.ReleaseMouseCapture(); >private void Btn_OnMouseMove(object sender, MouseEventArgs e) < if (_movePoint == null) return; var p = e.GetPosition(this) - (Vector)_movePoint.Value; Canvas.SetLeft(btn, p.X); Canvas.SetTop(btn, p.Y); >> > 

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

Как в WPF создать кнопку, при наведении на которую, под текстом появилась горизонтальная черта?

1) Поместить в шаблон просто TextBlock, добавить в него стиль, триггер, который при наведении будет выставлять значение атрибута TextDecoration в Underline. Проблема — нету события Click.
2) Поместить внутрь ContentPresenter. Отсутствует атрибут TextDecoration.

Не могли бы вы подсказать способ, который помог бы решить задачу без проблем?

  • Вопрос задан более трёх лет назад
  • 3703 просмотра

Как сделать кнопку назад в wpf

В WPF кнопки представлены целым рядом классов, которые наследуются от базового класса ButtonBase:

Кнопки Button в WPF

Button

Элемент Button представляет обычную кнопку:

От класса ButtonBase кнопка наследует ряд событий, например, Click, которые позволяют обрабатывать пользовательский ввод.

Чтобы связать кнопку с обработчиком события нажатия, нам надо определить в самой кнопке атрибут Click . А значением этого атрибута будет название обработчика в коде C#. А затем в самом коде C# определить этот обработчик.

Например, код xaml:

И обработчик в коде C#:

private void Button_Click(object sender, RoutedEventArgs e)

Либо можно не задавать обработчик через атрибут, а стандартным образом для C# прописать в коде: button1.Click+=Button_Click;

Кнопка имеет такие свойства как IsDefault и IsCancel , которые принимают значения true и false.

Если свойство IsDefault установлено в true, то при нажатии клавиши Enter будет вызываться обработчик нажатия этой кнопки.

Аналогично если свойство IsCancel будет установлено в true, то при нажатии на клавишу Esc будет вызываться обработчик нажатия этой кнопки.

Например, определим код xaml:

А в коде MainWindow.xaml.cs определим следующий код C#:

using System.Windows; namespace ControlsApp < public partial class MainWindow : Window < public MainWindow() < InitializeComponent(); >private void acceptButton_Click(object sender, RoutedEventArgs e) < MessageBox.Show("Действие выполнено"); >private void escButton_Click(object sender, RoutedEventArgs e) < this.Close(); // закрытие окна >> >

Теперь при нажатии на клавишу Enter будет отображаться сообщение, а при нажатии на Esc будет происходить выход из приложения и закрытие окна.

RepeatButton

Отличительная особенность элемента RepeatButton — непрерывная генерация события Click , пока нажата кнопка. Интервал генерации события корректируется свойствами Delay и Interval .

Сам по себе элемент RepeatButton редко используется, однако он может служить основой для создания ползунка в элементах ScrollBar и ScrollViewer, в которых нажатие на ползунок инициирует постоянную прокрутку.

ToggleButton

Представляет элементарный переключатель. Может находиться в трех состояниях — true, false и «нулевом» (неотмеченном) состоянии, а его значение представляет значение типа bool? в языке C#. Состояние можно установить или получить с помощью свойства IsChecked . Также добавляет три события — Checked (переход в отмеченное состояние), Unchecked (снятие отметки) и Intermediate (если значение равно null). Чтобы отрабатывать все три события, надо установить свойство IsThreeState=»True»

ToggleButton, как правило, сам по себе тоже редко используется, однако при этом он служит основой для создания других более функциональных элементов, таких как checkbox и radiobutton.

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

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

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

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

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

Кнопка «Назад»

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

Back button in the top left of the app

      " IsEnabled="" ToolTipService.ToolTip="Back"/>  

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

Back button on top command bar

       " IsEnabled="" ToolTipService.ToolTip="Back" VerticalAlignment="Top"/>     

Чтобы свести к минимуму перемещение элементов пользовательского интерфейса в приложении, отображайте кнопку «Назад» отключенной, если стек переходов назад пуст ( IsEnabled=»» ). Но если предполагается, что ваше приложение никогда не будет иметь стека переходов назад, вам вообще не нужно отображать кнопку «Назад».

Back button states

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

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

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

  • Рабочий стол или концентратор. Нарисуйте кнопку «Назад в приложении» в левом верхнем углу пользовательского интерфейса приложения.
  • Режим планшета: на планшетах может присутствовать кнопка аппаратного или программного обеспечения, но мы рекомендуем нарисовать кнопку назад в приложении для ясности.
  • 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.* .

  . " IsEnabled="" ToolTipService.ToolTip="Back"/> . 
// 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(); 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(); // . // Perform back navigation if possible. static bool TryGoBack() < Frame rootFrame< nullptr >; auto content = Window::Current().Content(); if (content) < rootFrame = content.try_as(); 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(); // . // 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(); 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(); // . 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, системный пользовательский интерфейс отобразит системную кнопку «Назад» внутри заголовка окна. (Внешний вид и взаимодействие с пользователем для кнопки «Назад» не изменились по сравнению с предыдущими сборками.)

Title bar back button

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

Некоторые мыши оснащены аппаратными кнопками для навигации вперед и назад. Вы можете обеспечить поддержку этих кнопок мыши, обрабатывая событие 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(); // . 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(); // . // Perform back navigation if possible. static bool TryGoBack() < Frame rootFrame< nullptr >; auto content = Window::Current().Content(); if (content) < rootFrame = content.try_as(); 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(); 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, пересекая группы одноранговых узлов, поэтому навигация добавляется в журнал навигации.

Diagram of navigation across peer groups showing the user navigating from group one to group two and the back to group one.

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

Diagram of navigation across peer groups showing the user navigating from group one to group two then on to group three and back to group two.

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

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

Navigation within a peer group

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

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

Navigation across peer groups when a navigation element is present

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

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

Showing a transient UI

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

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

Iterm enumeration

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

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

Связанные статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *