- A+
由于Blazor属于SPA(single-page application),所以页面标题需要使用PageTitle
组件来实现。但是在MAUI Blazor中,Blazor所在的位置是WebView,而标题是属于window。所以在MAUI Blazor中,使用PageTitle
是无效的。
提示
MAUI中,除了Windows平台外,其他平台没有Title这个概念。
设置MAUI标题的几种方法!
在CreateWindow中修改
在根目录的App.xaml.cs
中,添加CreateWindow重写方法。
namespace MauiBlazorApp; public partial class App : Application { public App() { InitializeComponent(); MainPage = new MainPage(); } protected override Window CreateWindow(IActivationState activationState) { var window = base.CreateWindow(activationState); if (DeviceInfo.Current.Platform == DevicePlatform.WinUI) { window.Title = System.Reflection.Assembly.GetEntryAssembly().GetName().Name; } return window; } }
在OnLaunched中修改
之前在网上找到了修改标题的代码:
protected override void OnLaunched(LaunchActivatedEventArgs args) { base.OnLaunched(args); Microsoft.Maui.Essentials.Platform.OnLaunched(args); var currentWindow = Application.Windows[0].Handler.NativeView; IntPtr _windowHandle = WindowNative.GetWindowHandle(currentWindow); var windowId = Win32Interop.GetWindowIdFromWindow(_windowHandle); AppWindow appWindow = AppWindow.GetFromWindowId(windowId); appWindow.Title = "Title!"; }
其中Application.Windows[0].Handler.NativeView
提示不正确。原来是在MAUI RC的时候,把Application.Windows[0].Handler.NativeView
改为了Application.Windows[0]?.Handler?.PlatformView;
改下代码:
//var currentWindow = Application.Windows[0].Handler.NativeView; var currentWindow = Application.Windows[0].Handler?.PlatformView;
虽然拿到了window。但appWindow.Title = "Title!";
并没有起作用,调试的时候,window明明也赋值了。但就是不行。
有知道的大神可以给指点下吗?我的环境是.NET 7,MAUI Blazor应用。
在观察了CreateWindow的Window之后,发现Window继承的是IWindow,而Application.Windows
拿到的是一个IReadOnlyList<IWindow>
,那么还是获取第一个IWindow
,转换成Window
是不是就可以了呢?
找到文件:Platforms -> Windows -> App.xaml.cs,添加重写方法OnLaunched
protected override void OnLaunched(LaunchActivatedEventArgs args) { base.OnLaunched(args); }
定义一个window
public static Microsoft.Maui.Controls.Window window;
在OnLaunched
添加代码:
protected override void OnLaunched(LaunchActivatedEventArgs args) { base.OnLaunched(args); window = Application.Windows[0] as Microsoft.Maui.Controls.Window; window.Title = "Title!" }
运行后,发现可以!
动态修改标题
在CreateWindow
设置标题后,其他页面是无法进行修改的。如何动态的修改标题呢?办法就是在OnLaunched
下功夫了。在Platforms -> Windows -> App.xaml.cs中增加一个方法:
public static void SetPageTitle(string title) => window.Title = title;
删除OnLaunched
中的window.Title = "Title!"
。
修改Index.razor
:
protected override void OnAfterRender(bool firstRender) { if(firstRender) { #if WINDOWS WinUI.App.SetPageTitle("首页 - index"); #endif } }
看下效果:
总结
如果各位大神有更好的方法,欢迎评论区告诉我,一起共勉!
点击下方公众号卡片,关注我!一起学习,一起进步!