众所周知,UWP 使用的窗口模型是 CoreWindow,但是 UWP 本身只是一个应用模型,所以完全可以创建 win32 窗口,那么我们可以不可以创建一个 win32 窗口,然后像 XAML 岛 (XAML Islands) 一样把 XAML 托管上去呢?本篇将讲述如何利用 WAS (Windows App SDK,俗称 WinUI3) 在 UWP 创建一个 XAML 岛窗口。
演示视频:https://x.com/wherewhere7/status/
由于 WAS 在 win32 应用模型下本身就是个 XAML 岛,所以 WAS 对 XAML 岛的支持要比 WUXC (Windows.UI.Xaml.Controls) 要好多了,接下来的内容大多是将 WAS 中实现窗口的方法迁移到 C#。
首先,不管是 WUXC 还是 WAS 的 XAML 岛都会判断当前的应用模型是否为,所以我们需要利用劫持方法。具体内容如下:
准备工作完成,接下来我们就可以创建窗口了,如果顺利的话我们只需要就行了,但是很遗憾,经过测试在 UWP 并不能正常初始化这个类,有可能是我使用的方法不太正确,或许以后可能能找到正常使用的办法,不过现在我们只能去手动创建一个 Win32 窗口了。
首先我们需要新创建一个线程,CoreWindow 线程无法新建 XAML 岛,不过在 XAML 岛线程可以,新建线程只需要用就行了。
WAS 提供了来管理 win32 窗口,我们只需要使用它创建一个窗口就行了。

接下来我们需要创建 XAML 岛,这时我们就需要利用上面劫持器来劫持获取应用模型的方法了。
然后我们就可以把 XAML 岛糊到之前创建的 AppWindow 上了。
由于 XAML 岛存在的一些特性,当窗口扩展标题栏或者全屏化的时候窗口内容并不会跟着变化,所以我们需要一些小魔法来让它在变化时调整大小。
最后不要忘了保持当前线程,不然这里跑完了窗口就退出了。
当窗口关闭后记得执行来释放保持的线程。
最后把之前的东西组合起来,再加点东西:
其中是用来存放和的类,如果不嫌麻烦的话可以包裹成一个和一样的东西。
最后附上示例应用:https://github.com/wherewhere/CoreAppUWP/tree/muxc

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/174674.html