Подтвердить что ты не робот

Обработка обратной навигации Windows 10 (UWP)

На моей странице Xaml у меня есть кадр.

Я пытаюсь, чтобы событие backButton просто перемещалось внутри фрейма.

поэтому я попытался использовать этот фрагмент кода

public MainPage(){
    this.InitializeComponent();
    if(Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons")) {
        Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
    }
}
private void HardwareButtons_BackPressed(object sender,BackPressedEventArgs e) {
    if(insideFrame.CanGoBack())insideFrame.GoBack();
    else  Application.Current.Exit();
}

но в телефоне после события HardwareButtons_BackPressed он закроет приложение.

Кажется, что работает некорректное поведение кнопки по умолчанию на MainPage...

Как я могу это исправить? И в Windows10 они добавляют новые события для обработки навигации?


[Обновление]

Теперь я понял, что лучше использовать SystemNavigationManager в Windows 10 вместо Input.HardwareButtons.BackPressed.

SystemNavigationManager currentView = SystemNavigationManager.GetForCurrentView();
4b9b3361

Ответ 1

Вам нужно сообщить системе, что вы обработали нажатие кнопки, установив для свойства BackpedesEventArgs значение Handled значение true.

  private void OnHardwareButtonsBackPressed(object sender, BackPressedEventArgs e)
  {
        // This is the missing line!
        e.Handled = true;

        // Close the App if you are on the startpage
        if (mMainFrame.CurrentSourcePageType == typeof(Startpage))
            App.Current.Exit();

        // Navigate back
        if (mMainFrame.CanGoBack)
        {
            mMainFrame.GoBack();
        }
  }

Ответ 2

Windows 10 (UWP) включает SystemNavigationManager в пространстве имен Windows.UI.Core только для целей навигации.

Потому что SystemNavigationManager является частью Windows Universal Platform, поэтому он поддерживается всем семейством устройств, работающих в Windows 10, включая Mobile и ПК.

Для одной страницы


Если вы просто хотите обрабатывать навигацию для одной страницы. Выполните следующие шаги.

Шаг 1. Использовать пространство имен Windows.UI.Core

using Windows.UI.Core;

Шаг 2. Зарегистрировать запрос назад для текущего представления. Лучшим местом для этого является главный конструктор класса после InitializeComponent().

public MainPage()
{
    this.InitializeComponent();
    //register back request event for current view
    SystemNavigationManager.GetForCurrentView().BackRequested += MainPage_BackRequested;
}

Шаг 3. Обработать событие BackRequested

private void Food_BackRequested(object sender, BackRequestedEventArgs e)
{
    if (Frame.CanGoBack)
    {
        Frame.GoBack();
        e.Handled = true;
    }
}

Для полного приложения в одном месте для одиночного rootFrame


Лучшее место для обработки всех подложек для всех просмотров - App.xaml.cs

Шаг 1. Использовать пространство имен Windows.UI.Core

using Windows.UI.Core;

Шаг 2. Зарегистрировать запрос назад для текущего представления. Лучшее место для этого - OnLaunched непосредственно перед Window.Current.Activate

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    ...
    SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
    Window.Current.Activate();
}

Шаг 3. Обработать событие BackRequested

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

Ссылки - Кнопка возврата назад в UWP

Надеюсь, это поможет кому-то!

Ответ 3

выполните следующие действия:

  • Добавьте две глобальные переменные на вашей странице, как показано ниже.

    private NavigationHelper navigationHelper;
    private RelayCommand _GoBackCommand;
    
  • Затем добавьте ниже код в конструктор конкретной страницы.

        // below code is to override the back navigation
        // hardware back button press event from navigationHelper
        _GoBackCommand = new RelayCommand
            (
                () => this.CheckGoBack(),
                () => this.CanCheckGoBack()
            );
    
        navigationHelper.GoBackCommand = _GoBackCommand;
        // ---------
    
  • Затем добавьте оба метода, которые мы только что объявили в конструкторе.

    private bool CanCheckGoBack()
    {
        // this should be always true to make sure the app handles back buton manually.
        return true;
    }
    
    private void CheckGoBack()
    {
        // this will be execute when back button will be pressed
    }
    

пс. - для этого вам может потребоваться использовать BasicPage вместо BlankPage при добавлении новой страницы.

надеюсь, что это поможет..!

Ответ 4

Попробуйте это. Он будет работать для обратной навигации по кадру.

  protected override void OnNavigatedTo(NavigationEventArgs e)
    {

      HardwareButtons.BackPressed += HardwareButtons_BackPressed;

    }


    void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
    {

    Frame rootFrame = Window.Current.Content as Frame;

        if (Frame.CanGoBack)
        {
            e.Handled = true;
            Frame.GoBack();
        }
    }

}

Ответ 5

Я думаю, это потому, что вы добавляете HardwareButtons_BackPressed на свою страницу, а не в app.xaml.cs.

В app.xaml.cs:

public App()
{
    this.InitializeComponent();
    this.Suspending += this.OnSuspending;

    HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}

void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;

    if (rootFrame != null && rootFrame.CanGoBack)
    {
        e.Handled = true;
        rootFrame.GoBack();
    }
}

Теперь кнопка "Назад" вашего телефона будет работать на любых страницах.

И затем, если вы хотите добавить определенную кнопку, сделав обратно на любой странице:

На конкретной странице (или на каждой странице, если хотите):

public void btn_return_Tapped(object sender, TappedRoutedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;

            if (rootFrame != null && rootFrame.CanGoBack)
            {
                e.Handled = true;
                rootFrame.GoBack();
            }
        }

Источник: http://windowsapptutorials.com/tips/general-tips/handling-the-back-button-in-a-windows-phone-8-1-app/