由于Blazor属于SPA(single-page application),所以页面标题需要使用PageTitle
组件来实现。但是在MAUI Blazor中,Blazor所在的位置是WebView,而标题是属于window。所以在MAUI Blazor中,使用PageTitle
是无效的。
提示
MAUI中,除了Windows平台外,其他平台没有Title这个概念。
在根目录的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;
}}
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);}
public static Microsoft.Maui.Controls.Window window;
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
}}
看下效果: