c# navigation windows-10 windows-10-mobile

c# - Manejo de la navegación hacia atrás Windows 10(UWP)



navigation windows-10 (5)

En mi página de Xaml tengo un marco.

Estoy tratando de tener un evento backButton para navegar dentro del marco.

así que intenté usar este 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 ejecutar un comportamiento predeterminado del botón de retroceso 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();


Creo que esto se debe a que agregas HardwareButtons_BackPressed en tu página en lugar de en app.xaml.cs.

En 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(); } }

Ahora, el botón de retroceso de su teléfono funcionará en cualquier página.

Y luego, si desea agregar un botón en particular haciendo de nuevo en cualquier página:

En la página en particular (o cada página si lo desea):

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(); } }

Fuente: http://windowsapptutorials.com/tips/general-tips/handling-the-back-button-in-a-windows-phone-8-1-app/


Debe decirle al sistema que manejó la presión del botón de retroceso configurando la propiedad Manejado 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(); } }


Prueba esto. Funcionará para la navegación de retroceso de fotogramas.

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(); } } }


Windows 10 (UWP) incluye SystemNavigationManager en el espacio de nombres Windows.UI.Core solo para fines de navegación.

Debido a que SystemNavigationManager es parte de Windows Universal Platform , es compatible con toda la familia de dispositivos que se ejecutan en Windows 10, incluidos Mobile y PC.

Para una sola página

Si solo desea manejar la navegación para una sola página. Sigue los siguientes pasos

Paso 1 Use el espacio de nombres Windows.UI.Core

using Windows.UI.Core;

Paso 2. Registre el evento de solicitud de regreso 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. Controlar el evento solicitado de nuevo

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

Para la aplicación completa en un lugar para un solo rootFrame

El mejor lugar para manejar todos los botones de retroceso para todas las Vistas es App.xaml.cs

Paso 1 Use el espacio de nombres Windows.UI.Core

using Windows.UI.Core;

Paso 2. Registre el evento de solicitud de regreso para la vista actual. El mejor lugar para esto es OnLaunched justo antes de Window.Current.Activate

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

Paso 3. Controlar el evento solicitado de nuevo

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

Referencias: se presionó el botón Atrás del controlador en UWP

Espero que esto sea útil para alguien!


sigue estos pasos:

  • Agregue dos variables globales en su página como se muestra a continuación.

    private NavigationHelper navigationHelper; private RelayCommand _GoBackCommand;

  • Luego agregue el siguiente código en el constructor de la página específica.

    // 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; // ---------

  • Luego agregue ambos métodos que acabamos de declarar en constructor.

    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 }

PD. - para esto puede que necesite usar BasicPage lugar de BlankPage mientras agrega una nueva página.

Espero que esto ayude ..!