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 ...
随机推荐
- 万字长文详解Text-to-SQL
什么是Text-to-SQL 在各个企业数据量暴涨的现在,Text-to-SQL越来越重要了,所以今天就来聊聊Text-to-SQL. Text-to-SQL是一种将自然语言查询转换为数据库查询的技术 ...
- Dubbo学习系列之十九(Apollo分布式部署)
说一个人是武林高手:十八般武艺,样样精通!如今,后端技术层出不穷,让人眼花缭乱,如果看官不能达到样样精通,至少 拿起方天画戟能耍几下才行,比如削个苹果.言归正传,配置中心属于基础设施,当然必须玩得溜, ...
- 轻松的工作(deepseek)
组长:"这里有一百多个地震波形文件,把每一个地震建立一个文件夹,并把地震波形放到对应日期的地震中." 我想:一个一个整好麻烦想摸会鱼 让我们来deepseek吧~ 首先,生成文件夹 ...
- langchain0.3教程:聊天机器人进阶之方法调用
我们思考一个问题:大语言模型是否能帮我们做更多的事情,比如帮我们发送邮件.默认情况下让大模型帮我们发送邮件,大模型会这样回复我们: 可以看到,大模型无法发送邮件,它只会帮我们生成一个邮件模板,然后让我 ...
- Devops相关考试和认证
Devops相关考试和认证 Red Hat Certified System Administrator (RHCSA) 能够执行以下任务: 了解和运用必要的工具来处理文件.目录.命令行环境和文档 操 ...
- 解决VSCODE进行C代码编辑时结构体成员不可见或不提示的问题
在使用VSCODE进行C代码编辑时,结构体成员有时可见,光标放到成员上时,系统会提示结构体成员对应的注释信息,但是有时候却不行. 经过测试,发现有如下规律:以test.c test.h include ...
- .NET 平台上的开源模型训练与推理进展
.NET 平台上的开源模型训练与推理进展 作者:痴者工良 博客:https://www.whuanle.cn 电子书仓库:https://github.com/whuanle/cs_pytorch M ...
- MySQL插入异常:SQL state [HY000]; error code [1366]-----(utf8mb4)
发现爬虫软件,爬取数据不及时,查询服务器日志发现异常: SQL state [HY000]; error code [1366] java.sql.SQLException: Incorrect st ...
- jmeter之请求体类型
一.当post方法的提交数据类型(content-type)为multipart/form-data,请求体为文件文件上传. fiddler抓包请求体的name对应jmerter文件上传的参数名称,f ...
- web自动化基础
一.浏览器驱动 下载浏览器对应版本驱动 Chromedriver下载地址:https://npm.taobao.org/mirrors/chromedriver 下载谷歌对应版本对应系统的驱动,把下载 ...