翼度科技»论坛 编程开发 .net 查看内容

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

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
由于Blazor属于SPA(single-page application),所以页面标题需要使用PageTitle组件来实现。但是在MAUI Blazor中,Blazor所在的位置是WebView,而标题是属于window。所以在MAUI Blazor中,使用PageTitle是无效的。
提示
MAUI中,除了Windows平台外,其他平台没有Title这个概念。
设置MAUI标题的几种方法!

目录

在CreateWindow中修改

在根目录的App.xaml.cs中,添加CreateWindow重写方法。
  1. namespace MauiBlazorApp;
  2. public partial class App : Application
  3. {
  4.         public App()
  5.         {
  6.                 InitializeComponent();
  7.                 MainPage = new MainPage();
  8.         }
  9.         protected override Window CreateWindow(IActivationState activationState)
  10.         {
  11.         var window = base.CreateWindow(activationState);
  12.         if (DeviceInfo.Current.Platform == DevicePlatform.WinUI)
  13.         {
  14.             window.Title = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
  15.         }
  16.         return window;
  17.     }
  18. }
复制代码
在OnLaunched中修改

之前在网上找到了修改标题的代码:
  1. protected override void OnLaunched(LaunchActivatedEventArgs args)
  2. {
  3.     base.OnLaunched(args);
  4.     Microsoft.Maui.Essentials.Platform.OnLaunched(args);
  5.     var currentWindow = Application.Windows[0].Handler.NativeView;
  6.     IntPtr _windowHandle = WindowNative.GetWindowHandle(currentWindow);
  7.     var windowId = Win32Interop.GetWindowIdFromWindow(_windowHandle);
  8.     AppWindow appWindow = AppWindow.GetFromWindowId(windowId);
  9.     appWindow.Title = "Title!";
  10. }
复制代码
其中Application.Windows[0].Handler.NativeView提示不正确。原来是在MAUI RC的时候,把Application.Windows[0].Handler.NativeView改为了Application.Windows[0]?.Handler?.PlatformView;
改下代码:
  1. //var currentWindow = Application.Windows[0].Handler.NativeView;
  2. var currentWindow = Application.Windows[0].Handler?.PlatformView;
复制代码
虽然拿到了window。但appWindow.Title = "Title!";并没有起作用,调试的时候,window明明也赋值了。但就是不行。
有知道的大神可以给指点下吗?我的环境是.NET 7,MAUI Blazor应用。
在观察了CreateWindow的Window之后,发现Window继承的是IWindow,而Application.Windows拿到的是一个IReadOnlyList,那么还是获取第一个IWindow,转换成Window是不是就可以了呢?
找到文件:Platforms -> Windows -> App.xaml.cs,添加重写方法OnLaunched
  1. protected override void OnLaunched(LaunchActivatedEventArgs args)
  2. {
  3.     base.OnLaunched(args);
  4. }
复制代码
定义一个window
  1. public static Microsoft.Maui.Controls.Window window;
复制代码
在OnLaunched添加代码:
  1. protected override void OnLaunched(LaunchActivatedEventArgs args)
  2. {
  3.     base.OnLaunched(args);
  4.     window = Application.Windows[0] as Microsoft.Maui.Controls.Window;
  5.     window.Title = "Title!"
  6. }
复制代码
运行后,发现可以!

动态修改标题

在CreateWindow设置标题后,其他页面是无法进行修改的。如何动态的修改标题呢?办法就是在OnLaunched下功夫了。在Platforms -> Windows -> App.xaml.cs中增加一个方法:
  1. public static void SetPageTitle(string title) => window.Title = title;
复制代码
删除OnLaunched中的window.Title = "Title!"。
修改Index.razor:
  1. protected override void OnAfterRender(bool firstRender)
  2. {
  3.     if(firstRender)
  4.     {
  5.         #if WINDOWS
  6.         WinUI.App.SetPageTitle("首页 - index");
  7.         #endif
  8.     }
  9. }
复制代码
看下效果:

总结

如果各位大神有更好的方法,欢迎评论区告诉我,一起共勉!
点击下方公众号卡片,关注我!一起学习,一起进步!

来源:https://www.cnblogs.com/gmval/archive/2023/01/08/17034958.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具