c# navigation windows-phone windows-phone-8.1 win-universal-app

c# - La aplicación universal Windows Phone 8.1 finaliza al navegar desde la segunda página?



navigation windows-phone (3)

Tengo 2 páginas en mi aplicación para Windows Phone 8.1 Universal.

Navego de Página1 .xaml a Página2 .xaml usando un botón con el código de evento de clic:

this.Frame.Navigate(typeof(Page2));

Cuando estoy en la página 2 y uso el botón de retroceso de hardware, la aplicación se cierra sin excepción ni nada. Simplemente vuelve a la pantalla de inicio.

Ya probé lo siguiente en la página 2 :

public Page2() { this.InitializeComponent(); Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed; } void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e) { Frame.GoBack(); }

Por lo que yo sé, no borro la pila de respaldo.

¿Qué está pasando y cómo puedo solucionarlo?

Saludos cordiales, Niels


Esto es nuevo para Windows Phone 8.1.

Si crea una nueva aplicación Hub Universal utilizando una plantilla VS2013, verá una clase en la carpeta Común llamada NavigationHelper.

Este NavigationHelper le da una pista de cómo reaccionar adecuadamente al presionar el botón Atrás. Por lo tanto, si no desea usar NavigationHelper, aquí le mostramos cómo recuperar el comportamiento anterior:

public BlankPage1() { this.InitializeComponent(); HardwareButtons.BackPressed += HardwareButtons_BackPressed; } void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e) { if (Frame.CanGoBack) { e.Handled = true; Frame.GoBack(); } }

También puede hacerlo a nivel de aplicación, para evitar tener que hacerlo en cada página:

public App() { this.InitializeComponent(); this.Suspending += this.OnSuspending; #if WINDOWS_PHONE_APP HardwareButtons.BackPressed += HardwareButtons_BackPressed; #endif } #if WINDOWS_PHONE_APP void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e) { Frame rootFrame = Window.Current.Content as Frame; if (rootFrame != null && rootFrame.CanGoBack) { e.Handled = true; rootFrame.GoBack(); } } #endif


Puede usar el "patrón" NavigationHelper que también lo ayuda a manejar eventos de vida útil.

NavigationHelper es una clase proporcionada por Microsoft (no es parte de la API de Windows Phone) donde puede registrar sus páginas y NavigationHelper se ocupa de FrameHistory.

Para usar NavigationHelper, debe agregar la clase a su proyecto y registrar las páginas en NavigationHelper cuando se carguen. Cuando agrega una página básica (no una página en blanco) a su proyecto, VisualStudio agrega una carpeta llamada común con algunas clases auxiliares, incluida la clase NavigationHelper.

Para registrar sus páginas en NavigationHelper, debe agregar el siguiente código a todas las páginas que desee en NavigationHelper.

public sealed partial class MySuperCoolPage : Page { private readonly NavigationHelper navigationHelper; public MySuperCoolPage() { InitializeComponent(); navigationHelper = new NavigationHelper(this); } protected override void OnNavigatedFrom(NavigationEventArgs e){ this.navigationHelper.OnNavigatedFrom(e); } protected override void OnNavigatedTo(NavigationEventArgs e) { navigationHelper.OnNavigatedTo(e); } }

Para obtener más información sobre este tema y la capacidad de manejar eventos del ciclo de vida, puede leer este article o ver este video .


Si desea mostrar un cuadro de diálogo de confirmación cuando presiona el botón Atrás, tome nota del código siguiente

private async void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e) { e.Handled = true; if (Frame.CanGoBack) { Frame.GoBack(); } else { var msg = new MessageDialog("Confirm Close"); var okBtn = new UICommand("OK"); var cancelBtn = new UICommand("Cancel"); msg.Commands.Add(okBtn); msg.Commands.Add(cancelBtn); IUICommand result = await msg.ShowAsync(); if (result != null && result.Label == "OK") { Application.Current.Exit(); } } }