11

Ho una pagina del modulo xamarin in cui un utente può aggiornare alcuni dati in un modulo. Devo intercettare il pulsante Indietro della barra di navigazione Cliccato per avvisare l'utente se alcuni dati non sono stati salvati. Come fare?Come intercettare il pulsante Indietro della barra di navigazione Cliccato su Xamarin Forms?

Sono in grado di intercettare il pulsante Indietro della barra hardware Cliccato su Android utilizzando lo Android.MainActivity.OnBackPressed(), ma tale evento viene generato solo sulla barra hardware Pulsante Indietro fatto clic, non sulla barra di navigazione Pulsante Indietro fatto clic.

Ho provato anche a ignorare Xamarin.Forms.NavigationPageOnBackButtonPressed() ma non funziona. Perché? Qualcuno ha già risolto il problema?

ho provato anche sovrascrivendo OnDisappear(), ci sono due problemi: "Sei sicuro"

  1. La pagina è già scomparso visivamente in modo che il la finestra di dialogo appare sulla pagina precedente.
  2. Impossibile annullare l'azione di ritorno.

Quindi, è possibile intercettare la barra di navigazione indietro premere?

risposta

0

Questo è un compito intrinsecamente difficile e l'unico modo per aggirare il problema era rimuovere completamente il pulsante Indietro e quindi gestire la navigazione all'indietro da un pulsante "Salva".

Ho fatto una breve ricerca del forum Xamarin.Forms e il successivo è stato suggerito:

public override bool OnOptionsItemSelected(Android.Views.IMenuItem item) 
{ 
    return false; 
} 

Il link per il posto è la seguente:

https://forums.xamarin.com/discussion/21631/is-there-nay-way-of-cancelling-the-back-button-event-from-the-navigationpage

-1

In Xamarin .Forms, la classe Page ha un metodo OnBackButtonPressed() che è possibile sfruttare per tutte le piattaforme

+1

Questo non vi dice se si preme il pulsante sul retro di navigazione/icona - solo se viene premuto il pulsante Indietro del sistema – noelicus

3

Il più semplice, come @JordanMazurke anche cita un po ', dal momento che l'evento per il pulsante indietro, non può essere gestito al momento (a parte il pulsante fisico posteriore per Android), è quello di uno:

  1. NavigationPage.ShowHasBackButton(this, false)
  2. Spingendo un Modal invece di un Page

Successivamente, è possibile aggiungere un ActionbarItem da cui è possibile gestire lo Event.

io personalmente parlato alla squadra iOS da Xamarin riguardo a questo argomento, e si tratta fondamentalmente mi ha detto che non dovremmo aspettarci il supporto per la gestione del Event per la BackButtonPressed nel NavigationBar. Il motivo è che, su iOS, è una cattiva pratica per gli utenti ricevere un messaggio quando viene premuto Back.

+0

:(questo mi rende triste. –

7

Sono riuscito a visualizzare una finestra di dialogo di conferma in grado di annullare la navigazione eseguendo l'override dei seguenti metodi in FormsApplicationActivity.

// navigation back button 
    public override bool OnOptionsItemSelected(IMenuItem item) 
    { 
    if (item.ItemId == 16908332) 
    { 
     var currentViewModel = (IViewModel)navigator.CurrentPage.BindingContext; 
     currentViewModel.CanNavigateFromAsync().ContinueWith(t => 
     { 
      if (t.Result) 
      { 
       navigator.PopAsync(); 
      } 
     }, TaskScheduler.FromCurrentSynchronizationContext()); 
     return false; 
    } 
    else 
    { 
     return base.OnOptionsItemSelected(item); 
    } 
    } 

    // hardware back button 
    public async override void OnBackPressed() 
    { 
    var currentViewModel = (IViewModel)navigator.CurrentPage.BindingContext; 

    // could display a confirmation dialog (ex: "Cancel changes?") 
    var canNavigate = await currentViewModel.CanNavigateFromAsync(); 
    if (canNavigate) 
    { 
     base.OnBackPressed(); 
    } 
    } 

Il navigatore.CurrentPage è un wrapper del servizio INavigation. Non devo cancellare la navigazione dalle pagine modali, quindi sto gestendo solo NavigationStack.

this.navigation.NavigationStack[this.navigation.NavigationStack.Count - 1]; 
0

Come è già stato detto, non è possibile eseguire questa multipiattaforma. Tuttavia, è possibile gestirlo in modo nativo con non tanto sforzo: https://theconfuzedsourcecode.wordpress.com/2017/03/12/lets-override-navigation-bar-back-button-click-in-xamarin-forms/

L'articolo copre iOS e Android. Se hai un progetto UWP dovrai martellare la tua soluzione per questo.

Modifica: Ecco la soluzione UWP! In realtà si è rivelato essere abbastanza facile - c'è solo un pulsante indietro ed è supportata da forme in modo da avere solo per ignorare di ContentPage OnBackButtonPressed:

protected override bool OnBackButtonPressed() 
    { 
     if (Device.RuntimePlatform.Equals(Device.UWP)) 
     { 
      OnClosePageRequested(); 
      return true; 
     } 
     else 
     { 
      base.OnBackButtonPressed(); 
      return false; 
     } 
    } 

    async void OnClosePageRequested() 
    { 
     var tdvm = (TaskDetailsViewModel)BindingContext; 
     if (tdvm.CanSaveTask()) 
     { 
      var result = await DisplayAlert("Wait", "You have unsaved changes! Are you sure you want to go back?", "Discard changes", "Cancel"); 

      if (result) 
      { 
       tdvm.DiscardChanges(); 
       await Navigation.PopAsync(true); 
      } 
     } 
     else 
     { 
      await Navigation.PopAsync(true); 
     }   
    } 
Problemi correlati