gpt4 book ai didi

android - DisplayAlert 在触摸外部时取消

转载 作者:行者123 更新时间:2023-11-29 01:15:18 24 4
gpt4 key购买 nike

我正在用 xamarin 表单创建一个应用程序。我正在使用 Display Alert 来显示带有是/否按钮的消息。但是当用户在弹出窗口之外点击时,它会关闭。我不想关闭外部水龙头的弹出窗口。只有在用户点击是或否按钮后,它才会关闭。

我如何管理我的弹出窗口,以便当用户点击 xamarin 表单中的弹出窗口外部时它无法关闭?

最佳答案

这可能有点太晚了,但它可能会让遇到这个问题的其他人受益。


一旦您知道如何操作,这可以很容易地完成。下面是一个简短的分步指南,可以帮助您运行。

  1. 在共享项目中新建一个Class文件,命名为CustomYesNoBox.cs
  2. 在此文件中,粘贴以下代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;

    using Xamarin.Forms;

    public class CustomYesNoBox
    {
    public string Text { get; set; }
    public string Title { get; set; }
    public List<string> Buttons { get; set; }

    public CustomYesNoBox(string title, string text, params string[] buttons)
    {
    Title = title;
    Text = text;
    Buttons = buttons.ToList();
    }

    public CustomYesNoBox(string title, string text):this(title, text, "Yes", "No")
    {
    }

    public event EventHandler<CustomYesNoBoxClosedArgs> PopupClosed;
    public void OnPopupClosed(CustomYesNoBoxClosedArgs e)
    {
    var handler = PopupClosed;
    if (handler != null)
    handler(this, e);
    }

    public void Show()
    {
    DependencyService.Get<IYesNoPopupLoader>().ShowPopup(this);
    }
    }

    public class CustomYesNoBoxClosedArgs : EventArgs
    {
    public string Button { get; set; }
    }

    public interface IYesNoPopupLoader
    {
    void ShowPopup(CustomYesNoBox reference);
    }
  3. 在您的 Android 项目文件夹中,添加一个新类,并将其命名为 YesNoPopupLoader.cs

  4. 在此文件中,粘贴以下代码:

    using Android.App;
    using Android.Widget;

    using <YOUR_NAMESPACE>.Droid.Implementation;

    using Xamarin.Forms;

    [assembly: Dependency(typeof(YesNoPopupLoader))]
    namespace <YOUR_NAMESPACE>.Droid.Implementation
    {
    public class YesNoPopupLoader : IYesNoPopupLoader
    {
    public void ShowPopup(CustomYesNoBox popup)
    {
    var alert = new AlertDialog.Builder(Forms.Context);

    var textView = new TextView(Forms.Context) { Text = popup.Text };
    alert.SetView(textView);

    alert.SetTitle(popup.Title);

    var buttons = popup.Buttons;

    alert.SetPositiveButton(buttons[0], (senderAlert, args) =>
    {
    popup.OnPopupClosed(new CustomYesNoBoxClosedArgs
    {
    Button = buttons[0]
    });
    });

    alert.SetNegativeButton(buttons[1], (senderAlert, args) =>
    {
    popup.OnPopupClosed(new CustomYesNoBoxClosedArgs
    {
    Button = buttons[1]
    });
    });

    alert.SetCancelable(false);
    alert.Show();
    }
    }
    }
  5. 在您的 iOS 项目中,添加一个新的类文件,并将其命名为 YesNoPopupLoader.cs

  6. 在此文件中,粘贴以下代码:

    using System;
    using System.Linq;

    using <YOUR_NAMESPACE>.iOS.Implementation;

    using UIKit;

    [assembly: Xamarin.Forms.Dependency(typeof(YesNoPopupLoader))]
    namespace <YOUR_NAMESPACE>.iOS.Implementation
    {
    public class YesNoPopupLoader : IYesNoPopupLoader
    {
    public void ShowPopup(CustomYesNoBox popup)
    {
    var alert = new UIAlertView
    {
    Title = popup.Title,
    Message = popup.Text
    };
    foreach (var b in popup.Buttons)
    alert.AddButton(b);

    alert.Clicked += (s, args) =>
    {
    popup.OnPopupClosed(new CustomYesNoBoxClosedArgs
    {
    Button = popup.Buttons.ElementAt(Convert.ToInt32(args.ButtonIndex)),
    });
    };
    alert.Show();
    }
    }
    }
  7. 返回到您的共享项目,然后转到您希望访问消息框的任何位置。在此示例中,我的 MainPage 中有一个按钮会提示此消息框:

    YesNoButton.Clicked += (sender, e) =>
    {
    var popup = new CustomYesNoBox("Question", "Is this Android?");
    popup.PopupClosed += (o, closedArgs) =>
    {
    if (closedArgs.ButtonText == "Yes")
    {
    // Do something on positive response
    }
    else if(closedArgs.ButtonText == "No")
    {
    // Do something on negative response
    }
    else
    {
    // Unknown response. Do nothing?
    }
    };

    popup.Show();
    };

应该就是这样。您可以尝试创建 Xamarin Forms 不提供的其他自定义消息框(带有下拉菜单、文本输入、进度指示器等),或自定义消息框的布局。

关于android - DisplayAlert 在触摸外部时取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40169056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com