Android 触摸输出侧显示警报取消

Android 触摸输出侧显示警报取消,android,xamarin.forms,alert,Android,Xamarin.forms,Alert,我正在用xamarin表单创建一个应用程序。我正在使用“显示警报”显示带有“是/否”按钮的消息。但当用户点击弹出窗口的外部时,它就会靠近。我不想在外部点击时关闭弹出窗口。只有在用户单击“是”或“否”按钮后,它才会关闭 我如何管理我的弹出窗口,使其在用户点击xamarin表单中弹出窗口外部时无法关闭 使用AcrUserDialog可能是另一种选择 这可能有点太晚了,但可能会让遇到这个问题的其他人受益 一旦你知道怎么做,这很容易做到。下面是一个简单的分步指南,应该可以帮助你跑步 在共享项目中创建一

我正在用xamarin表单创建一个应用程序。我正在使用“显示警报”显示带有“是/否”按钮的消息。但当用户点击弹出窗口的外部时,它就会靠近。我不想在外部点击时关闭弹出窗口。只有在用户单击“是”或“否”按钮后,它才会关闭

我如何管理我的弹出窗口,使其在用户点击xamarin表单中弹出窗口外部时无法关闭

使用AcrUserDialog可能是另一种选择


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


一旦你知道怎么做,这很容易做到。下面是一个简单的分步指南,应该可以帮助你跑步

  • 在共享项目中创建一个新类文件,并将其命名为CustomYesNoBox.cs
  • 在此文件中,粘贴以下代码:

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

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

    我尝试显示警报,直到用户选择肯定按钮。我别无选择,只能这样做,因为这是一项紧急要求

    bool input = await DisplayAlert("Sync", "Press Sync", "Sync", "Cancel");
    while (!input) //Enters when clicked outside or (cancel) negative button
    {
      input = await DisplayAlert("Sync Rules", "Press Sync", "Sync", "Cancel");
    }
    // Code when Sync is clicked
    

    以后将尝试@Tom建议的方法。

    您也可以使用xlabs。使用此功能,您可以显示自定义弹出窗口,并且在后台单击时它不会关闭。您可以提供“关闭”按钮或“是”或“否”按钮来执行任务或取消任务。

    发生这种情况时,您是否可以再次显示它?当用户点击外部时,您会得到什么样的结果?您必须编写一个自定义渲染器,在XFIt中无法做到这一点。这不是很清楚-您是否建议将其作为一个有效的解决方案?@yakobom这不是一个有效的解决方案。这只是一个变通办法。我将使用while循环继续显示警报。
    bool input = await DisplayAlert("Sync", "Press Sync", "Sync", "Cancel");
    while (!input) //Enters when clicked outside or (cancel) negative button
    {
      input = await DisplayAlert("Sync Rules", "Press Sync", "Sync", "Cancel");
    }
    // Code when Sync is clicked