后退按钮按下事件的确认对话框 Xamarin.Forms

Confirmation Dialog on back button press event Xamarin.Forms

我卡在 Xamarin.Forms 应用程序的某一点上

在后退按钮上按下只是想问用户确认他是否真的想退出, "OnBackButtonPressed" 我想显示警报对话框并根据用户响应继续。

但是 "OnBackButtonPressed" 不是 Async 我不能写 await DisplayAlert... 请指导我应该如何实现此功能?

我使用 ContentPage 作为 NavigationPage 的根页面

    public class frmHome : ContentPage

这是代码:

protected override bool OnBackButtonPressed()
{
    var result = await  this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");

    if (result)
        {
            //user wants to exit
            //Terminate application
        }
        else
        {
            //Dont do anything
        }
}
    protected override bool OnBackButtonPressed()
    {
        Device.BeginInvokeOnMainThread(async() => {
            var result = await this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");
            if (result) await this.Navigation.PopAsync(); // or anything else
        });

        return true;
    }

覆盖硬件后退按钮并向用户显示确认对话框的简单方法

protected override bool OnBackButtonPressed()
{
    Device.BeginInvokeOnMainThread(async () =>
    {
        if (await DisplayAlert("Alert", "Are you sure you want to go back ?", "Yes", "No"))
        {
            base.OnBackButtonPressed();

            await Navigation.PopAsync();
         }
    });

    return true;
}
public override void OnBackPressed()
{
    RunOnUiThread(
        async () =>
        {
            var isCloseApp = await AlertAsync(this, "NameOfApp", "Do you want to close this app?", "Yes", "No");

            if (isCloseApp)
            {
                var activity = (Activity)Forms.Context;
                activity.FinishAffinity();
            }
        });
}

public Task<bool> AlertAsync(Context context, string title, string message, string positiveButton, string negativeButton)
{
    var tcs = new TaskCompletionSource<bool>();

    using (var db = new AlertDialog.Builder(context))
    {
        db.SetTitle(title);
        db.SetMessage(message);
        db.SetPositiveButton(positiveButton, (sender, args) => { tcs.TrySetResult(true); });
        db.SetNegativeButton(negativeButton, (sender, args) => { tcs.TrySetResult(false); });
        db.Show();
    }

    return tcs.Task;
}

Xamarin.Android await AlertDialog.Builder

 private async void OnDelete(object sender, EventArgs e)
        {
            var result = await this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");
            if (result)
            {

                var menuitem = sender as MenuItem;
                string name = menuitem.BindingContext as string;

                lielements.Remove(name);
            }
            else
            {


            }

        }

如果您在 Mainpage 上并想退出您的应用程序,那么此代码将帮助您。

在你的 UI (PCL)

  protected override bool OnBackButtonPressed()
            {

                Device.BeginInvokeOnMainThread(new Action(async () => {
                    var result = await this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");

                    if (result)
                    {
                        if (Device.RuntimePlatform == Device.Android)
                            DependencyService.Get<IAndroidMethods>().CloseApp();
                    }
                }));
                return true;
            }

同时创建一个接口(在您的 UI PCL 中):

public interface IAndroidMethods
{
    void CloseApp();
}

现在在您的 Android 项目中实现 Android 特定的逻辑:

[assembly: Xamarin.Forms.Dependency(typeof(AndroidMethods))]
namespace Your.Namespace
{
   public class AndroidMethods : IAndroidMethods
   {
       public void CloseApp()
       {
             var activity = (Activity)Forms.Context;
            activity.FinishAffinity();
       }
   }
}

这是对我有用的代码

protected override bool OnBackButtonPressed()
    {
        Device.BeginInvokeOnMainThread(async () =>
        {
            var result = await this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");

            if (result)
            {
                System.Diagnostics.Process.GetCurrentProcess().CloseMainWindow(); // Or anything else
            }
        });
        return true;
    }

这样就搞定了

protected override bool OnBackButtonPressed()
{
    var result = await  this.DisplayAlert("Alert!", "Do you really want to exit?", "Yes", "No");

    if (result)
        {
            Process.GetCurrentProcess().CloseMainWindow();
            Process.GetCurrentProcess().Close();
        }
        else
        {
            //Dont do anything
        }
}