最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天关注:【MAUI Blazor踩坑日记】3.Windows标题栏自定义颜色,运行时改变颜色

来源:博客园

目录


(资料图片仅供参考)

  • 修改默认颜色
  • 修改运行时颜色
  • 效果图

MAUI中Windows默认的标题栏颜色是灰色的,有一点丑。

如果去掉默认的标题栏,自己画一个,可能会出现问题,也比较麻烦。

想要自定义默认标题栏的颜色,官方又没有提供接口。找过了很多资料,也用过很多办法,始终不能完美的解决这个问题,大多数只是类似于配置的修改,不能在运行时修改颜色。

直到看到一位大佬的文章https://www.dongchuanmin.com/net/2955.html ,终于有了眉目。

在Win10和Win11中都可以正常用。

修改默认颜色

找到Platforms/Windows/App.xaml

                        #fff            #fff            #000            #000            

修改运行时颜色

  • 安装NuGet包

    NuGet包中搜索 PInvoke.User32,安装它

  • 添加修改标题栏颜色的类

    Platforms/Windows文件夹下添加WindowsTitleBar.cs

    using Microsoft.Maui.Platform;using PInvoke;using WinRT.Interop;using static PInvoke.User32;namespace MauiApp1{# nullable disablepublic static class WindowsTitleBar{private static Microsoft.UI.Xaml.Window GetActiveNativeWindow() =>(Microsoft.UI.Xaml.Window)Application.Current.Windows.FirstOrDefault()?.Handler?.PlatformView;public static void SetColorForWindows(Color backgroundColor,Color foregroundColor){var res = Microsoft.UI.Xaml.Application.Current.Resources;res["WindowCaptionBackground"] = backgroundColor.ToWindowsColor();res["WindowCaptionBackgroundDisabled"] = backgroundColor.ToWindowsColor();res["WindowCaptionForeground"] = foregroundColor.ToWindowsColor();res["WindowCaptionForegroundDisabled"] = foregroundColor.ToWindowsColor();TriggertTitleBarRepaint();}private static bool TriggertTitleBarRepaint(){#if WINDOWSvar nativeWindow = GetActiveNativeWindow();if (nativeWindow is null) { return default; }var hWnd = WindowNative.GetWindowHandle(nativeWindow);var activeWindow = User32.GetActiveWindow();if (hWnd == activeWindow){User32.PostMessage(hWnd, WindowMessage.WM_ACTIVATE, new IntPtr((int)0x00), IntPtr.Zero);User32.PostMessage(hWnd, WindowMessage.WM_ACTIVATE, new IntPtr((int)0x01), IntPtr.Zero);}else{User32.PostMessage(hWnd, WindowMessage.WM_ACTIVATE, new IntPtr((int)0x01), IntPtr.Zero);User32.PostMessage(hWnd, WindowMessage.WM_ACTIVATE, new IntPtr((int)0x00), IntPtr.Zero);}#endifreturn true;}}}
  • 调用

    #if WINDOWSvar backgroundColor = Colors.White;var foreColor = Colors.Black;WindowsTitleBar.SetColorForWindows(backgroundColor, foreColor);#endif

效果图

关键词: