学习.NET MAUI Blazor(五)、修改窗口标题

由于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
    }}

看下效果:
在这里插入图片描述