按钮事件Xamarin.Forms上的确认对话框

时间:2015-08-23 05:24:24

标签: xamarin xamarin.forms

我在Xamarin.Forms应用程序中遇到了一点

On Back按钮按下我想让用户确认他是否真的要退出, " OnBackButtonPressed"我想显示Alert对话框并按用户响应继续。

但是" OnBackButtonPressed"是不是Async我不能写等待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
        }
}

7 个答案:

答案 0 :(得分:29)

    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;
    }

答案 1 :(得分:2)

这是对我有用的代码

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;
    }

答案 2 :(得分:0)

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

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;
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果您在主页上并想要退出应用程序,则此代码将为您提供帮助。

在用户界面(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();
       }
   }
}

答案 5 :(得分:0)

我就这样完成了

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
        }
}

答案 6 :(得分:-1)

 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
            {


            }

        }