Me gustaría utilizar la función de compilación OnBackButtonPressed() de Xamarin Forms para navegarlos a la página principal o mantenerlos en la página actual y responder un DisplayAlert().

El problema es que no puedo esperar la respuesta (en este caso, OnAlertYesNoClicked();) cuando se invoca OnBackButtonPressed(), y dado que el valor predeterminado de un bool es false simplemente Cierra la aplicación.

¿Hay alguna forma de usar la respuesta de los usuarios como bool para OnBackButtonPressed()?

Ejemplo:

    bool action;
    async public void OnAlertYesNoClicked()
    {
        bool action = await DisplayAlert("Question?", "Are you sure you want to go back? Your result wont be saved!", "Yes", "No");
    }

    protected override bool OnBackButtonPressed()
    {
        OnAlertYesNoClicked();
        if(action == true)
        {
            Navigation.PushModalAsync(new MainPage(), true);
            return false;
        }
        else
        {
            return true;
        }  
    }
1
Rory 13 abr. 2020 a las 17:59

2 respuestas

La mejor respuesta

Manera fácil de anular el botón de retroceso del hardware y mostrar un cuadro de diálogo de confirmación al usuario.

 protected  override  bool OnBackButtonPressed()
    {
        //return base.OnBackButtonPressed();

        Device.BeginInvokeOnMainThread(async () =>
        {
            var result = await this.DisplayAlert("Question?", "Are you sure you want to go back? Your result wont be saved!", "Yes", "No");
            if (result) await this.Navigation.PushAsync(new Page14()); // or anything else

        });


        return true;
    }
2
Cherry Bu - MSFT 14 abr. 2020 a las 02:33

Lo que está sucediendo es que la verificación está ocurriendo antes de que el valor cambie en función de la entrada del usuario. Por lo tanto, desea basar la verificación en la entrada del usuario directamente.

Para hacer eso, en lugar de escribir lo que escribió, es posible que desee hacer esto:

public async Task<bool> OnAlertYesNoClicked()
{
    return await DisplayAlert("Question?", "Are you sure you want to go back? Your result wont be saved!", "Yes", "No");
}

protected override bool OnBackButtonPressed()
{
    if(OnAlertYesNoClicked().Result())
    ...

Se prefiere no usar .Result () para obtener la respuesta, pero no puede cambiar OnBackButtonPressed para devolver la tarea en su lugar.

-1
Saamer 13 abr. 2020 a las 19:25