.NET 8升级后.NET Maui(Blazor Hybrid)应用标题栏复现问题
.NET 8 MAUI Blazor Hybrid Windows标题栏隐藏失效的解决方案
问题原因
.NET 8 对 MAUI Windows 平台的窗口初始化流程和API做了调整,原.NET 6中直接调用presenter.SetBorderAndTitleBar或nativeWindow.ExtendsContentIntoTitleBar的方式,因窗口Handler初始化时机变化,导致代码执行时窗口实例未完全就绪,从而失效。另外Shell.NavBarIsVisible="False"控制的是Shell框架的导航栏,和Windows系统级标题栏无关,所以不会生效。
修复步骤
在Platforms/Windows/App.xaml.cs的OnLaunched方法中,调整代码执行时机和API调用方式:
- 确保在
base.OnLaunched(args)之后获取窗口实例,此时窗口Handler已完成初始化 - 使用.NET 8推荐的
AppWindowAPI来控制标题栏
代码示例
protected override void OnLaunched(LaunchActivatedEventArgs args) { base.OnLaunched(args); // 获取MAUI窗口对应的WinUI窗口实例 var mauiWindow = Application.Current.Windows[0]; if (mauiWindow?.Handler?.PlatformView is MauiWinUIWindow nativeWindow) { var appWindow = nativeWindow.AppWindow; // 方式1:直接隐藏标题栏 appWindow.TitleBar.IsVisible = false; // 方式2:设置无边框窗口(同时隐藏标题栏和边框) var overlappedPresenter = OverlappedPresenter.CreateForBorderlessWindow(); // 可选:保留窗口的最大化/最小化/关闭按钮需求 overlappedPresenter.IsMaximizable = true; overlappedPresenter.IsMinimizable = true; overlappedPresenter.IsCloseable = true; appWindow.Presenter = overlappedPresenter; } }
补充说明
- 如果仍需要使用
SetBorderAndTitleBar,需确保获取到正确的OverlappedPresenter实例,且在窗口初始化完成后调用:
if (appWindow.Presenter is OverlappedPresenter presenter) { presenter.SetBorderAndTitleBar(false, false); }
ExtendsContentIntoTitleBar仅在标题栏可见时生效,用于将内容延伸到标题栏区域,若要完全隐藏标题栏无需设置该属性。
内容的提问来源于stack exchange,提问作者jobrien9
相关产品推荐
相关产品推荐

