Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)

WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)

作者头像
walterlv
发布于 2023-10-22 03:37:14
发布于 2023-10-22 03:37:14
1.9K0
举报

在 WPF 中,如果想做一个背景透明的异形窗口,基本上都要设置 WindowStyle="None"AllowsTransparency="True" 这两个属性。如果不想自定义窗口样式,还需要设置 Background="Transparent"。这样的设置会让窗口变成 Layered Window,WPF 在这种类型窗口上的渲染性能是非常糟糕的。

本文介绍如何使用 WindowChrome 而不设置 AllowsTransparency="True" 制作背景透明的异形窗口,这可以避免异形窗口导致的低渲染性能。

背景透明的异形窗口

如下是一个背景透明异形窗口的示例:

此窗口包含很大的圆角,还包含 DropShadowEffect 制作的阴影效果。对于非透明窗口来说,这是不可能实现的。

如何实现

要实现这种背景透明的异形窗口,需要为窗口设置以下三个属性:

  • WindowStyle="None"
  • ResizeMode="CanMinimize"ResizeMode="NoResize"
  • WindowChrome.GlassFrameThickness="-1" 或设置为其他较大的正数(可自行尝试设置之后的效果)

如下就是一个最简单的例子,最关键的三个属性我已经高亮标记出来了。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

<Window x:Class="Walterlv.Demo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ++ WindowStyle="None" ResizeMode="CanMinimize" Title="walterlv demo" Height="450" Width="800"> ++ <WindowChrome.WindowChrome> ++ <WindowChrome GlassFrameThickness="-1" /> ++ </WindowChrome.WindowChrome> <Window.Template> <ControlTemplate TargetType="Window"> <Border Padding="64" Background="Transparent"> <Border CornerRadius="16" Background="White"> <Border.Effect> <DropShadowEffect BlurRadius="64" /> </Border.Effect> <ContentPresenter ClipToBounds="True" /> </Border> </Border> </ControlTemplate> </Window.Template> <Grid> <TextBlock FontSize="20" Foreground="#0083d0" TextAlignment="Center" VerticalAlignment="Center"> <Run Text="欢迎访问吕毅的博客" /> <LineBreak /> <Run Text="blog.walterlv.com" FontSize="64" FontWeight="Light" /> </TextBlock> </Grid> </Window>

网上流传的主流方法

在网上流传的主流方法中,AllowsTransparency="True" 都是一个必不可少的步骤,另外也需要 WindowStyle="None"。但是我一般都会极力反对大家这么做,因为 AllowsTransparency="True" 会造成很严重的性能问题。

如果你有留意到我的其他博客,你会发现我定制窗口样式的时候都在极力避开设置此性能极差的属性:

性能对比

既然特别说到性能,那也是口说无凭,我们要拿出数据来说话。

以下是我用来测试渲染性能所使用的例子:

相比于上面的例子来说,主要就是加了背景动画效果,这可以用来测试帧率。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

<Window x:Class="Walterlv.Demo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowStyle="None" ResizeMode="CanMinimize" Title="walterlv demo" Height="450" Width="800"> <WindowChrome.WindowChrome> <WindowChrome GlassFrameThickness="-1" /> </WindowChrome.WindowChrome> <Window.Template> <ControlTemplate TargetType="Window"> <Border Padding="64" Background="Transparent"> <Border CornerRadius="16" Background="White"> <Border.Effect> <DropShadowEffect BlurRadius="64" /> </Border.Effect> <ContentPresenter ClipToBounds="True" /> </Border> </Border> </ControlTemplate> </Window.Template> <Grid> ++ <Rectangle x:Name="BackgroundRectangle" Margin="0 16" Fill="#d0d1d6"> ++ <Rectangle.RenderTransform> ++ <TranslateTransform /> ++ </Rectangle.RenderTransform> ++ <Rectangle.Triggers> ++ <EventTrigger RoutedEvent="FrameworkElement.Loaded"> ++ <BeginStoryboard> ++ <BeginStoryboard.Storyboard> ++ <Storyboard RepeatBehavior="Forever"> ++ <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" ++ Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" ++ From="800" To="-800" /> ++ </Storyboard> ++ </BeginStoryboard.Storyboard> ++ </BeginStoryboard> ++ </EventTrigger> ++ </Rectangle.Triggers> ++ </Rectangle> <TextBlock FontSize="20" Foreground="#0083d0" TextAlignment="Center" VerticalAlignment="Center"> <Run Text="欢迎访问吕毅的博客" /> <LineBreak /> <Run Text="blog.walterlv.com" FontSize="64" FontWeight="Light" /> </TextBlock> </Grid> </Window>

那么性能数据表现如何呢?我们让这个窗口在 2560×1080 的屏幕上全屏渲染,得出以下数据:

方案

WindowChrome

AllowsTransparency

帧率(fps)数值越大越好,60 为最好

59

19

脏区刷新率(rects/s)数值越大越好

117

38

显存占用(MB)数值越小越好

83.31

193.29

帧间目标渲染数(个)数值越大越好

2

1

另外,对于显存的使用,如果我在 7680×2160 的屏幕上全屏渲染,WindowChrome 方案依然保持在 80+MB,而 AllowsTransparency 已经达到惊人的 800+MB 了。

可见,对于渲染性能,使用 WindowChrome 制作的背景透明异形窗口性能完虐使用 AllowsTransparency 制作的背景透明异形窗口,实际上跟完全没有设置透明窗口的性能保持一致。

此性能差异的原理解读,请参阅:

功能对比

既然 WindowChrome 方法在性能上完虐网上流传的设置 AllowsTransparency 方法,那么功能呢?

值得注意的是,由于在使用 WindowChrome 制作透明窗口的时候设置了 ResizeMode="None",所以你拖动窗口在屏幕顶部和左右两边的时候,Windows 不会再帮助你最大化窗口或者靠边停靠窗口,于是你需要自行处理。不过窗口的标题栏拖动功能依然保留了下来,标题栏上的右键菜单也是可以继续使用的。

方案

WindowChrome

AllowsTransparency

拖拽标题栏移动窗口

保留

自行实现

最小化最大化关闭按钮

丢失

丢失

拖拽边缘调整窗口大小

丢失

丢失

移动窗口到顶部可最大化

丢失

自行实现

拖拽最大化窗口标题栏还原窗口

保留

自行实现

移动窗口到屏幕两边可侧边停靠

丢失

自行实现

拖拽摇动窗口以最小化其他窗口

保留

自行实现

窗口打开/关闭/最小化/最大化/还原动画

丢失

丢失

表格中:

  • 保留 表示此功能无需任何处理即可继续支持
  • 自行实现 表示此功能已消失,但仅需要一两行代码即可补回功能
  • 丢失 表示此功能已消失,如需实现需要编写大量代码

另外,以上表格仅针对鼠标操作窗口。如果算上使用触摸来操作窗口,那么所有标记为 自行实现 的都将变为 丢失。因为虽然你可以一句话补回功能,但在触摸操作下各种 Bug,你解不完……

这两种实现的窗口之间还有一些功能上的区别:

方案

WindowChrome

AllowsTransparency

点击穿透

在完全透明的部分点击依然点在自己的窗口上

在完全透明的部分点击会穿透到下面的其他窗口

然而,如果你希望在使用高性能的 WindowChrome 时也依然能点击穿透,那么你需要使用到一点点的小技巧来绕过 WPF 对 WS_EX_LAYERED 窗口样式的锁定。请参见:WPF 制作支持点击穿透的高性能的透明背景异形窗口

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/wpf-transparent-window-without-allows-transparency.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected])

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手带你复现NC之Figure7
箱形图显示高/中分化LUAD肿瘤与低分化LUAD肿瘤成纤维细胞亚群的相对丰度,通过CIBERSORTx测量
生信技能树jimmy
2023/09/26
3130
手把手带你复现NC之Figure7
手把手带你复现NC图表之Figure6
为了检测肌成纤维细胞丰度作为LUAD患者分层预后生物标志物的可能性,使用TCGA-LUAD数据集测试
生信技能树jimmy
2023/09/26
3730
手把手带你复现NC图表之Figure6
单细胞经典文章复现(一)
从零基础掌握单细胞数据的分析技巧最有效的方法就是复现一篇单细胞研究文章,学习作者的分析思路和可视化方法。本次我们选择复现的文章是2023年发表在《Nature Communications》上的一篇研究,题为《Single-cell analysis reveals prognostic fibroblast subpopulations linked to molecular and immunological subtypes of lung cancer》,研究聚焦于肺癌肿瘤中的成纤维细胞(CAFs)单细胞分析。
天意生信云
2025/02/25
1430
单细胞经典文章复现(一)
手把手带你复现NC图表之Figure 4
探究从肺泡和外膜成纤维细胞亚群(在对照组织中富集)到肌成纤维细胞(在肿瘤组织中富集)的分化过程,对scRNA-seq数据集进行轨迹推断。结果表明外膜和肺泡成纤维细胞可以作为独立的祖细胞,肌成纤维细胞可以从这些祖细胞转分化
生信技能树jimmy
2023/09/26
4900
手把手带你复现NC图表之Figure 4
手把手带你复现NC图表之Figure 2
非小细胞肺癌中存在的成纤维细胞与非癌性肺组织中确定的三个主要亚群一致,并且可能对ECM维持/重构进行差异调节。这些数据还表明,与NSCLC肿瘤的相互作用导致这些亚群中基因表达的显著变化,除了亚群特异性表型变化外,还持续涉及间质胶原的上调。此外,与对照肺成纤维细胞相比,非小细胞肺癌的myoCAF基因特征增加,而对照肺组织的iCAF基因特征增加。
生信技能树jimmy
2023/09/26
3750
手把手带你复现NC图表之Figure 2
手把手带你复现NC图表之Figure 3
多重IHC(mxIHC)和 CIBERSORT显示成纤维细胞亚群占据空间离散的小生境和不同的NSCLC组织亚型富集
生信技能树jimmy
2023/09/26
2580
手把手带你复现NC图表之Figure 3
[Microbiome图表复现] 常规热图添加一些新元素
R语言数据分析指南
2023/11/30
3670
[Microbiome图表复现] 常规热图添加一些新元素
跟SCI学umap图| ggplot2 绘制umap图,坐标位置 ,颜色 ,大小还不是你说了算
umap/tsne图作为单细胞转录组的王牌图形之一,当seurat 或者 singleR 直接绘制的umap/tsne 图需要调整的时候,可能比较难调整,当然AI或者PS都可以办到 。但是本次主要分享使用ggplot2进行可视化,能比较方便的进行后期的微调 ,也学习回顾了ggplot2的基本参数。
生信补给站
2021/12/24
23.1K1
跟SCI学umap图|  ggplot2 绘制umap图,坐标位置 ,颜色 ,大小还不是你说了算
单细胞韧皮部研究代码解析2--comparison_denyer2019.R
单细胞韧皮部研究代码解析1-QC_filtering.R:https://cloud.tencent.com/developer/article/2256814?areaSource=&traceId
小胡子刺猬的生信学习123
2023/04/08
2880
单细胞韧皮部研究代码解析2--comparison_denyer2019.R
跟着Nature Genetics学作图:R语言ggplot2散点图展示主成分分析(PCA)的结果
https://doi.org/10.1038/s41588-023-01571-z
用户7010445
2023/12/01
5220
跟着Nature Genetics学作图:R语言ggplot2散点图展示主成分分析(PCA)的结果
单细胞韧皮部研究代码解析4-Fig01-umap_cell_types.R
单细胞韧皮部研究代码解析1-QC_filtering.R:https://cloud.tencent.com/developer/article/2256814?areaSource=&traceId
小胡子刺猬的生信学习123
2023/05/06
2940
单细胞韧皮部研究代码解析4-Fig01-umap_cell_types.R
肿瘤异质性强?试试这个样本整合包!
Poisson scRNA Integration of Mixed Unknown Signals(PRIMUS):混杂未知信号的泊松scRNA数据整合
生信菜鸟团
2023/01/05
5320
肿瘤异质性强?试试这个样本整合包!
单细胞代码解析-妇科癌症单细胞转录组及染色质可及性分析8
单细胞代码解析-妇科癌症单细胞转录组及染色质可及性分析1:https://cloud.tencent.com/developer/article/2055573
小胡子刺猬的生信学习123
2022/08/30
3940
单细胞代码解析-妇科癌症单细胞转录组及染色质可及性分析8
文献组图
追风少年i
2025/01/07
660
文献组图
数据地图多图层对象的颜色标度重叠问题解决方案
一篇旧文,解决一个困扰已经的小技术问题,权当是学习ggplot2以来的整理回顾与查漏补缺。 ---- 今天这一篇是昨天推送的基础上进行了进一步的深化,主要讲如何在离散颜色填充的地图上进行气泡图图层叠加。 为了使得案例前后一致,仍然使用昨天的数据集。 加载包: library("ggplot2") library("plyr") library("maptools") library("sp") library("ggthemes") 导入中国省界地图: china_map<-readShapePoly("
数据小磨坊
2018/04/11
1.7K0
数据地图多图层对象的颜色标度重叠问题解决方案
你还缺scRNA-seq的workflow吗?
之前曾老师给我看了一位在pipebio工作的生信工程师Roman Hillje的scRNA-seq的workflow,今天整理一下分享给大家。
生信菜鸟团
2024/07/31
3680
你还缺scRNA-seq的workflow吗?
跟着Nature Genetics学作图:使用ggarrange函数对ggplot2的多个图进行组合
https://www.nature.com/articles/s41588-022-01051-w
用户7010445
2023/01/06
2.9K0
跟着Nature Genetics学作图:使用ggarrange函数对ggplot2的多个图进行组合
跟着Nature Ecology&Evolution学作图:R语言ggplot2世界地图/柱形图/组合图
https://www.nature.com/articles/s41559-023-02235-1
用户7010445
2023/11/30
1.2K0
跟着Nature Ecology&Evolution学作图:R语言ggplot2世界地图/柱形图/组合图
绘图技巧 | 不同样式华夫饼图(Waffle charts)绘制技巧
今天这篇推文,小编为大家介绍华夫饼图(Waffle charts) 的绘制方法,这次主要介绍使用R-waffle包进行绘制。主要内容如下:
DataCharm
2022/05/24
1.7K0
绘图技巧 | 不同样式华夫饼图(Waffle charts)绘制技巧
从空间聚类的角度看结直肠癌肝转移的细胞异质性
结直肠癌(CRC)是一种恶性肿瘤,其中部分CRC存在转移性,尤其是肝转移,这也是预后较差的一个指标。转移过程涉及多个步骤,包括癌细胞从原发肿瘤部位逃逸、在血流中存活、在远处部位播散,最终生长为转移性肿瘤。癌细胞和基质细胞之间的交流在促进转移扩散中起着至关重要的作用。这种交流通过分泌细胞因子、生长因子和蛋白酶来重塑肿瘤微环境(TME)。TME是一种复杂的细胞组成,包括不同群体的成纤维细胞和免疫细胞,所有这些细胞在癌症逃避、转移和对治疗的反应中发挥重要作用。所以时空组学的研究就在于发现两种肿瘤之间的区别。
追风少年i
2023/06/28
3871
从空间聚类的角度看结直肠癌肝转移的细胞异质性
推荐阅读
相关推荐
手把手带你复现NC之Figure7
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档