En mi página Xaml tengo un marco.
Estoy tratando de tener un evento backButton para navegar dentro del marco.
así que traté de usar este fragmento de código
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(); } pero en el teléfono después de hacer el evento HardwareButtons_BackPressed , cierra la aplicación.
Parece que se está ejecutando un comportamiento de botón de retroceso predeterminado en MainPage ...
¿Cómo puedo arreglarlo? ¿Y en Windows10 agregan nuevos eventos para manejar la navegación hacia atrás?
[Actualizar]
Ahora descubrí que es mejor usar SystemNavigationManager en Windows 10 en lugar de Input.HardwareButtons.BackPressed .
SystemNavigationManager currentView = SystemNavigationManager.GetForCurrentView();Windows 10 (UWP) incluye SystemNavigationManager en el espacio de nombres Windows.UI.Core solo con fines de navegación.
Debido a que SystemNavigationManager es parte de Windows Universal Platform , es compatible con todas las familias de dispositivos que se ejecutan en Windows 10, incluidos dispositivos móviles y PC.
Si solo desea manejar la navegación para una sola página. Siga los siguientes pasos
Paso 1 Usar espacio de nombres Windows.UI.Core
using Windows.UI.Core; Paso 2. Registre el evento de solicitud de devolución para la vista actual. El mejor lugar para esto es el constructor principal de la clase después de InitializeComponent() .
public MainPage() { this.InitializeComponent(); //register back request event for current view SystemNavigationManager.GetForCurrentView().BackRequested += MainPage_BackRequested; }Paso 3. Manejar el evento BackRequested
private void Food_BackRequested(object sender, BackRequestedEventArgs e) { if (Frame.CanGoBack) { Frame.GoBack(); e.Handled = true; } }rootFrame El mejor lugar para manejar todos los botones de retroceso para todas las Vistas es App.xaml.cs
Paso 1 Usar espacio de nombres Windows.UI.Core
using Windows.UI.Core; Paso 2. Registre el evento de solicitud de devolución para la vista actual. El mejor lugar para esto es OnLaunched justo antes Window.Current.Activate
protected override void OnLaunched(LaunchActivatedEventArgs e) { ... SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested; Window.Current.Activate(); }Paso 3. Manejar el evento BackRequested
private void OnBackRequested(object sender, BackRequestedEventArgs e) { Frame rootFrame = Window.Current.Content as Frame; if (rootFrame.CanGoBack) { rootFrame.GoBack(); e.Handled = true; } }Referencias: Manejar el botón Atrás presionado en UWP
¡Espero que esto sea útil para alguien!
Debe decirle al sistema que manejó la pulsación del botón de retroceso configurando la propiedad Handled de BackPressedEventArgs en verdadero.
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(); } }Pruebe esto. Funcionará para la navegación hacia atrás del marco.
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(); } } }