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