Maui学习之路(一)--Windows窗体设置

Maui的学习之路

作为 Maui的先行者,我有话要说,微软你为了让我成为牛 B 的程序员真的是煞费苦心,你一定是觉得我不够牛逼所以针对我,存心想气死我。

好了废话不多说,Maui现在也算是正式发布了,我有点想用它来做一个桌面应用最好是支持 WindowsMac(当然 Linux我也想,但是微软不给我),于是我开始着手搞了起来。按照官方教程,下载安装 vs2022 最新预览版(Mac 也一样),勾选 Maui相关工作负载,创建 Maui模板程序,直接编译运行,一顿操作行云流水,顺利的让人直呼有戏。

OK,程序运行完美,Mac 上也很完美,而且一套代码在 WindowMac 上无缝运行,这很 nice,我开始有点信心满满。作为一名牛逼程序员我必须要有点自己的想法,比如我想做一个无边框的桌面应用,这应该很 easy,只需要更改 windowstyle 为 none(我以为是这样),因为一直以来都是这样,于是我也准备这样去做。可是找了半天无论是 Window 类或是 MauiWinUIWindow 还是 UIWindow 都没有。

我一定是眼花了,我需要更加仔细一点,我提醒自己,于是我又花了半个小时仔细找了一遍,甚至还看了点 Maui的源码(虽然我没看懂)。是的,我没有看错,是真的没有,好吧是我想得太简单了,作为跨平台程序要考虑那么多平台,这不是件容易的事,我安慰自己。

好的此路不通,那么我去看看Maui的官方教程,这一定有毕竟是官方教程吗?应该很全面。于是我又花了半个小时,看了一遍教程,很抱歉还是没有,嗯这是一件极其难的事情,毕竟是跨平台吗,可以理解。那我去找找WinUI的官方教程吧,毕竟是用的WinUI3。说干就干,我三下五除二直奔主体,功夫不负有心人,终于在标题栏里面找到了答案,虽然有答案,但是我还是想说微软真有你的,你做的这破玩意儿跟 mfc 有啥区别几乎就是原生 api 的简单封装吗,不愧是你 --- 我的巨硬(此处喊破喉咙) 。

我呵呵一笑,于是写下了 Maui Windows桌面程序修改标题栏的葵花宝典,只见上面密密麻麻写着坑爹。秘籍如下:

1、 你一定要有耐心;

2、 你一定要有耐心;

3、 你一定要有耐心;

4、 在使用该方案前你一定要注册 Windows 下的生命周期函数,参考文档:应用生命周期 - .NET MAUI | Microsoft Docs[1],你也可以不用这个方法,而是在 app 下重写 OnCreate 函数;

  • 注册生命周期函数

87fc767b8f1deb1a066070b2952c08a1.png
  • 重写 OnCreate 方法

f373e8450f40d9b2f7b4cf2f2dbb1c5d.png 39b2d2d4c9006e44d3649d98ff76dc2e.png

5、 你一定要将 Maui Windows 下自带的 ExtendsContentIntoTitleBar 设置为 false(这很重要,另外 Maui Window 类下有一个 SetTitleBar,对不起这不是你想的那样,怎么修改他都无效,可能是我太水没找到方法)

6、 使用 Maui 窗口句柄(Windows 平台),获取 AppWindow,修改 AppWindow 下的 TitleBar 的相关属性,参考文档:标题栏自定义 - Windows apps | Microsoft Docs [2]

3389ac7e90a2040a9c2a38bf448723d4.png

7、 完成以上步骤,那么恭喜你,你可以拥有一个无标题栏的窗口了(实际标题栏还在,只不过和下面的正式内容合并在一起了);

8、 好了完成了上述步骤,那么你一定也想做个,可以任意控制窗体初始化大小,以及最大化窗口的功能,这很抱歉,这真的是太难了。废话不多说,直接上代码,参考文档:AppWindow Class (Microsoft.UI.Windowing) - Windows App SDK | Microsoft Docs [3]

a) 窗体最大化需要调用 Win32Api,给窗体发送最大化事件(我做了简单的封装有需要的小伙伴可以找我要,也许还有别的方案只是我太笨)

e75ca4ec0c8ec0e036e4e0d58f7cb8cd.png

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

63c590086bc306c5e2c2f6eedd7f7408.png

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

866a967e8b899296ae17767de473ce4e.png

终于一个简单的窗体指定窗体大小、最大化窗体、无边框的窗体终于完成了,这确实很简单,满满的都是泪(现在还有一些问题就是标题栏拖动会影响按钮没法点击)。

最后,我只能发出无能狂怒,巨硬,下次请把我当傻子可以吗?

参考资料

[1]

参考文档:应用生命周期 - .NET MAUI | Microsoft Docs: https://docs.microsoft.com/zh-cn/dotnet/maui/fundamentals/app-lifecycle

[2]

参考文档:标题栏自定义 - Windows apps | Microsoft Docs : https://docs.microsoft.com/zh-cn/windows/apps/develop/title-bar?tabs=wasdk

[3]

参考文档:AppWindow Class (Microsoft.UI.Windowing) - Windows App SDK | Microsoft Docs : https://docs.microsoft.com/zh-CN/windows/windows-app-sdk/api/winrt/microsoft.ui.windowing.appwindow?view=windows-app-sdk-1.0

[4]

参考文档:AppWindowPresenter Class (Microsoft.UI.Windowing) - Windows App SDK | Microsoft Docs: https://docs.microsoft.com/zh-CN/windows/windows-app-sdk/api/winrt/microsoft.ui.windowing.appwindowpresenter?view=windows-app-sdk-1.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值