PRISM(Xamarin Forms)中IPageDialogService.DisplayAlertAsync为何非模态?
解决Android 11上Prism/Forms弹窗点击外部关闭的问题
针对你遇到的IPageDialogService.DisplayAlertAsync弹窗点击外部自动关闭的问题,可以尝试以下几种解决方案:
直接使用Xamarin.Forms原生弹窗验证
先绕开Prism的服务,在页面中直接调用await DisplayAlert("标题", "内容", "确定", "取消");,测试是否还会出现点击外部关闭的情况。如果原生弹窗正常,说明问题出在Prism的IPageDialogService封装上;如果原生弹窗也有同样问题,那就是Xamarin.Forms 5.x与Android 11的兼容问题。自定义Prism的PageDialogService实现
如果是Prism封装的问题,可以在Android项目中自定义一个弹窗服务,强制设置弹窗不可点击外部关闭:public class CustomPageDialogService : PageDialogService { protected override async Task<bool> OnDisplayAlertAsync(string title, string message, string acceptButton, string cancelButton) { if (Device.RuntimePlatform == Device.Android) { var currentPage = Application.Current.MainPage; // 直接使用原生弹窗确保模态行为 return await currentPage.DisplayAlert(title, message, acceptButton, cancelButton); // 若需要更底层控制,可创建Android原生AlertDialog(需自行处理异步返回逻辑) // var activity = Platform.CurrentActivity; // var tcs = new TaskCompletionSource<bool>(); // var alertDialog = new AlertDialog.Builder(activity) // .SetTitle(title) // .SetMessage(message) // .SetPositiveButton(acceptButton, (s, e) => tcs.TrySetResult(true)) // .SetNegativeButton(cancelButton, (s, e) => tcs.TrySetResult(false)) // .SetCancelable(false) // 关键:禁止点击外部关闭弹窗 // .Create(); // alertDialog.Show(); // return await tcs.Task; } return await base.OnDisplayAlertAsync(title, message, acceptButton, cancelButton); } }然后在App.xaml.cs的容器注册中替换默认服务:
protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterSingleton<IPageDialogService, CustomPageDialogService>(); // 其他注册代码... }排查自定义渲染器或第三方库干扰
检查项目中是否有自定义的AlertDialog渲染器,或者引入的第三方UI库修改了弹窗的默认行为,这类代码可能会意外将弹窗设置为可取消状态。升级依赖版本
你使用的Prism v8.1.97和Forms v5.0.0.2578都是相对较旧的版本,后续版本可能已经修复了Android 11下的弹窗兼容问题。尝试升级Prism到v8.1.198+,Xamarin.Forms到v5.0.0.2612+,再测试问题是否消失。
内容的提问来源于stack exchange,提问作者Martin Robins
相关产品推荐
相关产品推荐

