作为 Maui的先行者,我有话要说,微软你为了让我成为牛 B 的程序员真的是煞费苦心,你一定是觉得我不够牛逼所以针对我,存心想气死我。
好了废话不多说,Maui现在也算是正式发布了,我有点想用它来做一个桌面应用最好是支持 Windows 和 Mac(当然 Linux我也想,但是微软不给我),于是我开始着手搞了起来。
按照官方教程,下载安装 vs2022 最新预览版(Mac 也一样),勾选 Maui相关工作负载,创建 Maui模板程序,直接编译运行,一顿操作行云流水,顺利的让人直呼有戏。
OK,程序运行完美,Mac 上也很完美,而且一套代码在 Window 和 Mac 上无缝运行,这很 nice,我开始有点信心满满。
作为一名牛逼程序员我必须要有点自己的想法,比如我想做一个无边框的桌面应用,这应该很 easy,只需要更改 windowstyle 为 none(我以为是这样),因为一直以来都是这样,于是我也准备这样去做。可是找了半天无论是 Window 类或是 MauiWinUIWindow 还是 UIWindow 都没有。
我一定是眼花了,我需要更加仔细一点,我提醒自己,于是我又花了半个小时仔细找了一遍,甚至还看了点 Maui的源码(虽然我没看懂)。是的,我没有看错,是真的没有,好吧是我想得太简单了,作为跨平台程序要考虑那么多平台,这不是件容易的事,我安慰自己。
好的此路不通,那么我去看看Maui的官方教程,这一定有毕竟是官方教程吗?应该很全面。于是我又花了半个小时,看了一遍教程,很抱歉还是没有,嗯这是一件极其难的事情,毕竟是跨平台吗,可以理解。那我去找找WinUI的官方教程吧,毕竟是用的WinUI3。
说干就干,我三下五除二直奔主体,功夫不负有心人,终于在标题栏里面找到了答案,虽然有答案,但是我还是想说微软真有你的,你做的这破玩意儿跟 mfc 有啥区别几乎就是原生 api 的简单封装吗,不愧是你 --- 我的巨硬(此处喊破喉咙) 。
我呵呵一笑,于是写下了 Maui Windows桌面程序修改标题栏的葵花宝典,只见上面密密麻麻写着坑爹。
The secret script is as follows:
- You must be patient;
- You must be patient;
- You must be patient;
- 在使用该方案前你一定要注册 Windows 下的生命周期函数,参考文档:应用生命周期 - .NET MAUI | Microsoft Docs,你也可以不用这个方法,而是在
app下重写OnCreate函数;
- 注册
生命周期函数

- 重写
OnCreate方法


你一定要将
Maui Windows下自带的ExtendsContentIntoTitleBar设置为false(这很重要,另外Maui Window类下有一个SetTitleBar,对不起这不是你想的那样,怎么修改他都无效,可能是我太水没找到方法)使用 Maui 窗口句柄(
Windows平台),获取AppWindow,修改AppWindow下的TitleBar的相关属性,参考文档:标题栏自定义 - Windows apps | Microsoft Docs

After completing the above steps, congratulations, you can have a window without a title bar (the actual title bar is still there, but it is just merged with the official content below);
好了完成了上述步骤,那么你一定也想做个,可以任意控制窗体初始化大小,以及最大化窗口的功能,这很抱歉,这真的是太难了。废话不多说,直接上代码,参考文档:AppWindow Class (Microsoft.UI.Windowing) - Windows App SDK | Microsoft Docs
- 窗体最大化需要调用
Win32Api,给窗体发送最大化事件(我做了简单的封装有需要的小伙伴可以找我要,也许还有别的方案只是我太笨)

- 改变窗体大小需要调用
AppWindow的MoveAndResize注意这个函数内部并没有考虑过 Dpi 缩放的问题,需要你自己解决

- 启用全屏,需要使用
AppWindowPresenter,参考文档:AppWindowPresenter Class (Microsoft.UI.Windowing) - Windows App SDK | Microsoft Docs

Finally, a simple form to specify the form size, maximize the form, and borderless form are finally completed. This is really simple and full of tears (there are still some problems that dragging the title bar will affect the button's inability to click).
In the end, I could only unleash a rage of incompetence, extreme hardness, next time please treat me like a fool?