You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms中Acr.UserDialogs提示框无法显示在Rg.Plugins.Popup弹窗上层

解决Acr.UserDialogs Toast被Rg.Plugins.Popup遮挡的问题

这个问题我之前也碰到过,核心原因就是层级冲突:Rg的Popup弹窗会占据当前页面的上层渲染优先级,而Acr的Toast默认显示层级不够,就被压在下面了。虽然Xamarin Forms没有像Web那样直接的z-index属性,但我们可以针对不同原生平台调整Toast的原生显示层级,来实现类似的效果,具体方案如下:

1. Android平台调整Toast层级

在Android项目的MainActivity.cs中初始化Acr.UserDialogs时,我们可以自定义Toast的配置,把它的窗口类型设置为更高层级的ApplicationOverlay,确保能覆盖Popup弹窗:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    
    // 初始化UserDialogs并配置Toast层级
    UserDialogs.Init(this);
    var defaultToastConfig = new ToastConfig(string.Empty)
    {
        AndroidOptions = new AndroidOptions
        {
            // 设置窗口类型为应用覆盖层,优先级高于普通弹窗
            WindowType = Android.Views.WindowManagerTypes.ApplicationOverlay,
            // 可选:调整Toast的显示位置和动画
            Gravity = Android.Views.GravityFlags.Bottom | Android.Views.GravityFlags.CenterHorizontal,
            WindowAnimations = Android.Resource.Animation.SlideUp
        }
    };
    // 全局设置默认Toast配置
    UserDialogs.Instance.ToastConfig = defaultToastConfig;
    
    LoadApplication(new App());
}

注意:Android 8.0+需要在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2. iOS平台调整Toast层级

在iOS项目的AppDelegate.cs中,我们可以把Toast的窗口层级设置为UIWindowLevel.Alert + 1,让它的优先级高于普通弹窗(包括Rg的Popup):

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    global::Xamarin.Forms.Forms.Init();
    UserDialogs.Init();
    
    // 自定义iOS Toast配置
    var defaultToastConfig = new ToastConfig(string.Empty)
    {
        IosOptions = new IosOptions
        {
            // 设置窗口层级比系统Alert更高,确保覆盖Popup
            WindowLevel = UIKit.UIWindowLevel.Alert + 1
        }
    };
    UserDialogs.Instance.ToastConfig = defaultToastConfig;
    
    LoadApplication(new App());
    return base.FinishedLaunching(app, options);
}

3. 备选方案:临时隐藏Popup(不推荐)

如果上面的层级调整不生效,还有一个临时方案:在显示Toast之前,先隐藏当前的Popup,Toast显示完成后再恢复。但这个方案会打断用户的弹窗操作体验,所以只建议作为最后的备选:

// 显示Toast前隐藏Popup
await PopupNavigation.Instance.PopAllAsync();
UserDialogs.Instance.Toast("提示内容");
// 延迟后重新打开Popup(如果需要)
await Task.Delay(2000);
await PopupNavigation.Instance.PushAsync(new YourPopupPage());

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:11:35