WinUI 3 支持的三种窗口 及 受限的窗口透明

我的目标
希望能够熟悉 WinUI 3 窗口的基本使用方式,了解可能出现的问题 。
WinUI 3 支持三种窗口模式,分别为:常规窗口模式、画中画模式、全屏模式。
窗口模式:常规
即我们最常见的普通窗口。
支持:显示最大化按钮、最小化按钮、关闭按钮、标题栏、手动调整窗口尺寸、代码调整窗口尺寸、模态对话框、条件性支持窗口透明。

=> 窗口设置:
var overlappedPresenter = Microsoft.UI.Windowing.OverlappedPresenter.Create();
AppWindow.SetPresenter(overlappedPresenter);
=> 设置最大化:
if (AppWindow.Presenter is OverlappedPresenter presenter)
{
presenter.IsMaximizable = true;
presenter.Maximize();
}
=> 设置最小化:
presenter.IsMinimizable = true;
presenter.Minimize();
=> 设置标题栏:
presenter.SetBorderAndTitleBar(true, true);
Title = "测试标题";
=> 调整窗口尺寸:
AppWindow.Resize(new Windows.Graphics.SizeInt32(320, 240));
=> 模态对话框:
var presenter = Microsoft.UI.Windowing.OverlappedPresenter.CreateForDialog();
var win = new Window();
var mainWindowHandle = WinRT.Interop.WindowNative.GetWindowHandle(this);
var dialogHandle = WinRT.Interop.WindowNative.GetWindowHandle(win);
SetWindowLongPtr(dialogHandle, GWLP_HWNDPARENT, mainWindowHandle);
win.AppWindow.SetPresenter(presenter);
presenter.IsModal = true;
win.Activate();
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
=> 窗口透明:
//MainWindow2 是一个透明窗口,具体参见下文
new MainWindow2().AppWindow.Show();
窗口模式:画中画
这与 winform 和 wpf 的 TopMost 比较像,一直显示在上层。
支持:代码调整窗口尺寸、和隐藏标题栏
不支持:显示最大化按钮、最小化按钮、隐藏关闭按钮(可能需要其他比较复杂的方式隐藏)、 模态对话框、窗口透明。

=> 窗口设置:
var compactPresenter = Microsoft.UI.Windowing.CompactOverlayPresenter.Create();
AppWindow.SetPresenter(compactPresenter);
=> 隐藏标题栏:
ExtendsContentIntoTitleBar = true;
窗口模式:全屏
即铺满整个窗口。
支持:模态对话框、条件性支持窗口透明
不支持:显示标题栏、最大化按钮、最小化按钮、关闭按钮、调整窗口尺寸

=> 窗口设置:
var fullScreenPresenter = Microsoft.UI.Windowing.FullScreenPresenter.Create();
AppWindow.SetPresenter(fullScreenPresenter);
=> 窗口透明:
//MainWindow2 是一个透明窗口,具体参见下文
new MainWindow2().AppWindow.Show();
=> 模态对话框(变相支持):
var presenter = Microsoft.UI.Windowing.FullScreenPresenter.Create();
var win = new Window();
var mainWindowHandle = WinRT.Interop.WindowNative.GetWindowHandle(this);
var dialogHandle = WinRT.Interop.WindowNative.GetWindowHandle(win);
SetWindowLongPtr(dialogHandle, GWLP_HWNDPARENT, mainWindowHandle);
win.AppWindow.SetPresenter(presenter);
win.Activate();
它本身就会占据整个屏幕,不支持真正的模态对话框。所以作为 “变相支持”,效果是类似的。
限制性支持:窗口透明
WinUI 3 默认不支持真正的窗口透明度控制,无法通过简单的属性设置实现窗口透明,
因此找到了一个第三方的实现方式,它的实现控制代码有一万多行 编辑: https://github.com/castorix/WinUI3_SwapChainPanel_Layered
它的主要原理是:
SetLayeredWindowAttributes控制透明度 + UpdateLayeredWindow 更新窗口内容 + Direct2D 和 DXGI 硬件加速渲染 + SwapChain双缓冲渲染。
但是,这个透明的效果是有局限性的,仅在指定系统版本有效:

比对效果如下:

在项目属性中,设置为:

因此在使用透明窗口相关功能的时候,一定要非常的谨慎,很有可能开发出来对系统的兼容性非常差。
整体感受
WinUI 3 对窗口的类型进行了更细的分类,与 winform, WPF 相比,功能上差异并不是很大,但是使用起来比它们要麻烦好多;而且,对透明的支持受限制非常多。
因此,如果进行传统的桌面程序开发,我可能仍然会考虑 winform 和 wpf。
期待后续的探索,从这些独特设计的窗口分类中,希望能够看到让我惊艳的特性和性能,才能不负我如此艰辛 
WinUI 3 支持的三种窗口 及 受限的窗口透明的更多相关文章
- DB2支持的三种表空间SMS、DMS、DMS的自动存储
DB2支持的三种表空间SMS.DMS.DMS的自动存储 DB2中,表空间是数据库与这个数据库中存储的表之间的逻辑层.表空间在数据库中创建,表在表空间中创建.容器是一个物理存储设备.它可以由目录名.设备 ...
- spring对事务支持的三种形式
spring对事务支持的三种形式: 1.通过spring配置文件进行切面配置 <bean id="***Manager" class="org.springfram ...
- ESPlatform 支持的三种群集模型 —— ESFramework通信框架 4.0 进阶(09)
对于最多几千人同时在线的通信应用,通常使用单台服务器就可以支撑.但是,当同时在线的用户数达到几万.几十万.甚至百万的时候,我们就需要很多的服务器来分担负载.但是,依据什么规则和结构来组织这些服务器,并 ...
- Java面试题之Oracle 支持哪三种事务隔离级别
Oracle 支持三种事务隔离级别: 1.读已提交:(默认) 2.串行化: 3.只读模式
- Hive metastore三种配置方式
http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...
- Dataguard三种保护模式
Oracle Data Guard 提供三种高水平的数据保护模式来平衡成本.可用性.性能和事务保护.可以使用任意可用管理界面来轻松地设置这些模式.要确定适当的数据保护模式,企业需要根据用户对系统响应时 ...
- Netty中的三种Reactor(反应堆)
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- Spring学习(十八)Bean 的三种依赖注入方式介绍
依赖注入:让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖.接下来将详细的向大家介绍Spring容器支持的三种依赖注入的方式以及具体配置方法:• 属性注入方法• ...
- Kubernetes的三种探针
k8s支持存活livenessProbe和就绪readinessProbe两种探针 两种探针都支持以下三种方式 1.exec 通过执行shell命令的方式,判断退出状态码是否是0 示例 exec: c ...
- php-fpm解读-进程管理的三种模式
php-fpm进程管理一共有三种模式:ondemand.static.dynamic,我们可以在同一个fpm的master配置三种模式,看下图1.php-fpm的工作模式和nginx类似,都是一个ma ...
随机推荐
- ATT&CK实战系列(三)红日靶场3
本次打靶练习是一个黑盒测试.没有密码,我们的目标是拿到域控制器的权限,并找到其中的重要文件. 网络拓扑 网卡设置 centos为出网机,第一次运行,需重新获取桥接模式网卡ip. 需重启网络服务serv ...
- Jenkins合并代码Git报错处理过程
#jenkins合并代码时候报错内容#10:36:08 ! [rejected] HEAD -> master (non-fast-forward)#10:36:08 error: failed ...
- Random和猜数字小游戏
1.Random:使用方式和Scanner一样 Random用于生成随机数,括号里的10就是指在10以内随机生成一个数(0~9) Random生成的随机数都是从0开头 . 提问:那该如何让Random ...
- 【硬件】认识和选购多核CPU
2.1 认识和选购多核CPU CPU在电脑系统中就像人的大脑一样,是整个电脑系统的指挥中心,电脑的所有工作都由CPU进行控制和计算.它的主要功能是负责执行系统指令,包括数据存储.逻辑运算.传输控制.输 ...
- Hive SQL实现近N周的数据统计查询
文/朱季谦 先前遇到过一个需求,需要基于HIVE统计近N周范围的数据,例如,统计近7周范围的数据指标. 需要用HIVE SQL去实现该功能,而HIVE SQL并没有PostgreSQL那样例如通过函数 ...
- ORA-28001:口令已经失效
Oracle用户口令默认的有效期导致的一个异常,留爪. Oralce11G下,创建的用户及口令,也就是用户密码默认会有个180天的过期时间, 如果超过180天用户口令未做修改,则该用户口令失效,也就是 ...
- EagleOS 9.5-基于AlmaLinux 9.5深度定制优化
EagleOS 9.5 说明文档 一.系统简介 EagleOS 9.5基于AlmaLinux 9.5进行深度定制优化. EagleOS 9.5根据AlmaLinux 9.5官方AlmaLinux-9. ...
- Linux下安装node及npm
Linux下安装node 1.解压 $ tar zxf node-v8.9.0-linux-x64.tar.gz 2.移动到指定目录 $ mv node-v8.9.0-linux-x64 /usr/l ...
- 康谋分享 | aiSim5激光雷达LiDAR模型验证方法(二)
aiSim中的LiDAR是一种基于光线追踪的传感器,能够模拟真实LiDAR发射的激光束,将会生成LAS v1.4标准格式的3D点云,包含了方位角.俯仰角和距离等. aiSim能够模拟LiDAR单态(M ...
- AI提示词:一个通用C++ ECS系统实现(事件条件动作系统)
AI提示词 using eca_cond = bool(*)(...); using eca_action = void(*)(...); class eca_info { public: eca_c ...