我的目标

希望能够熟悉 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 支持的三种窗口 及 受限的窗口透明的更多相关文章

  1. DB2支持的三种表空间SMS、DMS、DMS的自动存储

    DB2支持的三种表空间SMS.DMS.DMS的自动存储 DB2中,表空间是数据库与这个数据库中存储的表之间的逻辑层.表空间在数据库中创建,表在表空间中创建.容器是一个物理存储设备.它可以由目录名.设备 ...

  2. spring对事务支持的三种形式

    spring对事务支持的三种形式: 1.通过spring配置文件进行切面配置 <bean id="***Manager" class="org.springfram ...

  3. ESPlatform 支持的三种群集模型 —— ESFramework通信框架 4.0 进阶(09)

    对于最多几千人同时在线的通信应用,通常使用单台服务器就可以支撑.但是,当同时在线的用户数达到几万.几十万.甚至百万的时候,我们就需要很多的服务器来分担负载.但是,依据什么规则和结构来组织这些服务器,并 ...

  4. Java面试题之Oracle 支持哪三种事务隔离级别

    Oracle 支持三种事务隔离级别: 1.读已提交:(默认) 2.串行化: 3.只读模式

  5. Hive metastore三种配置方式

    http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...

  6. Dataguard三种保护模式

    Oracle Data Guard 提供三种高水平的数据保护模式来平衡成本.可用性.性能和事务保护.可以使用任意可用管理界面来轻松地设置这些模式.要确定适当的数据保护模式,企业需要根据用户对系统响应时 ...

  7. Netty中的三种Reactor(反应堆)

    目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...

  8. Spring学习(十八)Bean 的三种依赖注入方式介绍

    依赖注入:让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖.接下来将详细的向大家介绍Spring容器支持的三种依赖注入的方式以及具体配置方法:•    属性注入方法• ...

  9. Kubernetes的三种探针

    k8s支持存活livenessProbe和就绪readinessProbe两种探针 两种探针都支持以下三种方式 1.exec 通过执行shell命令的方式,判断退出状态码是否是0 示例 exec: c ...

  10. php-fpm解读-进程管理的三种模式

    php-fpm进程管理一共有三种模式:ondemand.static.dynamic,我们可以在同一个fpm的master配置三种模式,看下图1.php-fpm的工作模式和nginx类似,都是一个ma ...

随机推荐

  1. 万字长文详解Text-to-SQL

    什么是Text-to-SQL 在各个企业数据量暴涨的现在,Text-to-SQL越来越重要了,所以今天就来聊聊Text-to-SQL. Text-to-SQL是一种将自然语言查询转换为数据库查询的技术 ...

  2. Dubbo学习系列之十九(Apollo分布式部署)

    说一个人是武林高手:十八般武艺,样样精通!如今,后端技术层出不穷,让人眼花缭乱,如果看官不能达到样样精通,至少 拿起方天画戟能耍几下才行,比如削个苹果.言归正传,配置中心属于基础设施,当然必须玩得溜, ...

  3. 轻松的工作(deepseek)

    组长:"这里有一百多个地震波形文件,把每一个地震建立一个文件夹,并把地震波形放到对应日期的地震中." 我想:一个一个整好麻烦想摸会鱼 让我们来deepseek吧~ 首先,生成文件夹 ...

  4. langchain0.3教程:聊天机器人进阶之方法调用

    我们思考一个问题:大语言模型是否能帮我们做更多的事情,比如帮我们发送邮件.默认情况下让大模型帮我们发送邮件,大模型会这样回复我们: 可以看到,大模型无法发送邮件,它只会帮我们生成一个邮件模板,然后让我 ...

  5. Devops相关考试和认证

    Devops相关考试和认证 Red Hat Certified System Administrator (RHCSA) 能够执行以下任务: 了解和运用必要的工具来处理文件.目录.命令行环境和文档 操 ...

  6. 解决VSCODE进行C代码编辑时结构体成员不可见或不提示的问题

    在使用VSCODE进行C代码编辑时,结构体成员有时可见,光标放到成员上时,系统会提示结构体成员对应的注释信息,但是有时候却不行. 经过测试,发现有如下规律:以test.c test.h include ...

  7. .NET 平台上的开源模型训练与推理进展

    .NET 平台上的开源模型训练与推理进展 作者:痴者工良 博客:https://www.whuanle.cn 电子书仓库:https://github.com/whuanle/cs_pytorch M ...

  8. MySQL插入异常:SQL state [HY000]; error code [1366]-----(utf8mb4)

    发现爬虫软件,爬取数据不及时,查询服务器日志发现异常: SQL state [HY000]; error code [1366] java.sql.SQLException: Incorrect st ...

  9. jmeter之请求体类型

    一.当post方法的提交数据类型(content-type)为multipart/form-data,请求体为文件文件上传. fiddler抓包请求体的name对应jmerter文件上传的参数名称,f ...

  10. web自动化基础

    一.浏览器驱动 下载浏览器对应版本驱动 Chromedriver下载地址:https://npm.taobao.org/mirrors/chromedriver 下载谷歌对应版本对应系统的驱动,把下载 ...