DisplayAlert在触摸外部取消

时间:2016-10-21 05:30:02

标签: android xamarin.forms alert

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

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

4 个答案:

答案 0 :(得分:1)

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

一旦你知道怎么做,这可以很容易地完成。以下是一个简要的分步指南,可以帮助您运行。

  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();
    };
    
  8. 那应该是它。您可以使用Xamarin Forms不提供的其他自定义消息框(带有下拉菜单,文本输入,进度指示器等),或自定义消息框的布局。

答案 1 :(得分:0)

  

使用AcrUserDialog可能是另一种选择。 https://github.com/aritchie/userdialogs

答案 2 :(得分:0)

我尝试显示警告,直到用户选择肯定按钮。我没有选择,只是因为这是一个迫切的要求。

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将来建议的内容。

答案 3 :(得分:0)

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