MAUI页面隐藏底部导航栏后恢复显示时出现异常求助
问题分析与解决方案
你的代码存在两个核心问题导致异常和恢复逻辑失效:
- 重复注册
WeakReferenceMessenger消息处理器,引发重复执行逻辑的异常 - 恢复导航栏时的
SystemUiFlags组合错误,同时方法名大小写不符合C#规范
修正步骤
1. 统一MainActivity中的消息处理逻辑
不要重复注册HideBottomOptions消息,将隐藏/恢复逻辑合并到同一个处理器中:
public class MainActivity : MauiAppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); WeakReferenceMessenger.Default.Register<HideBottomOptions>(this, (recipient, message) => { if (message.Value == "hide") { // 隐藏底部导航栏+状态栏,启用沉浸式粘性模式 Window.DecorView.SystemUiVisibility = (StatusBarVisibility)( SystemUiFlags.ImmersiveSticky | SystemUiFlags.HideNavigation | SystemUiFlags.Fullscreen ); } else if (message.Value == "show") { // 恢复底部导航栏和状态栏的正常显示 Window.DecorView.SystemUiVisibility = (StatusBarVisibility)( SystemUiFlags.Visible | SystemUiFlags.LayoutStable ); } }); } }
2. 修正页面的OnDisappearing方法
C#是大小写敏感语言,你之前的ondisappearing不会被系统正确调用,改为标准写法:
protected override void OnDisappearing() { base.OnDisappearing(); WeakReferenceMessenger.Default.Send(new HideBottomOptions("show")); }
3. 确保HideBottomOptions消息类正确实现
如果还未定义该类,添加如下代码:
public class HideBottomOptions : MessageBase { public string Value { get; } public HideBottomOptions(string value) { Value = value; } }
关键说明
- 移除重复的消息注册:多次注册同一类型消息会导致每次发送消息时执行多次逻辑,引发异常
- 修正SystemUiFlags组合:恢复时不要保留
HideNavigation标记,使用Visible确保导航栏正常显示 - 方法名大小写:
OnDisappearing是MAUI页面的生命周期方法,必须严格遵循大小写规范才能被系统触发
内容的提问来源于stack exchange,提问作者Matthew Pans
相关产品推荐
相关产品推荐

