我正在用xamarin表单创建一个应用程序。我使用显示警报显示带有是/否按钮的消息。但是当用户点击弹出窗口之外时,它就会关闭。我不想在外面点击关闭弹出窗口。只有在用户点击“是”或“否”按钮后才能关闭。
如何管理我的弹出窗口,以便当用户在xamarin表单中弹出弹出窗口时无法关闭它?
答案 0 :(得分:1)
这可能有点太晚了,但是遇到这个问题的其他人可能会受益。
一旦你知道怎么做,这可以很容易地完成。以下是一个简要的分步指南,可以帮助您运行。
在此文件中,粘贴以下代码:
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);
}
在 Android 项目文件夹中,添加一个新类,并将其命名为 YesNoPopupLoader.cs 。
在此文件中,粘贴以下代码:
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();
}
}
}
在 iOS 项目中,添加一个新的类文件,并将其命名为 YesNoPopupLoader.cs 。
在此文件中,粘贴以下代码:
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();
}
}
}
返回您的共享项目,然后转到您希望访问消息框的任何位置。在这个例子中,我的 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不提供的其他自定义消息框(带有下拉菜单,文本输入,进度指示器等),或自定义消息框的布局。
答案 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。使用此功能,您可以显示自定义弹出窗口,并且不会在后台点击时关闭。您可以提供关闭按钮或是或否按钮来执行任务或取消任务。