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

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


本文内容

  • 背景透明的异形窗口
  • 如何实现
  • 网上流传的主流方法
  • 性能对比
  • 功能对比

背景透明的异形窗口

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtThHnZZ-1574811718213)(https://blog.walterlv.com/static/posts/2019-09-07-13-16-56.png)]

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

如何实现

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

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

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

    <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" 会造成很严重的性能问题。

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

  • WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)

性能对比

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

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

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

    <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,你解不完……

  • WPF 程序无法触摸操作?我们一起来找原因和解决方法!

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

方案 WindowChrome AllowsTransparency 说明
点击穿透 在完全透明的部分点击依然点在自己的窗口上 在完全透明的部分点击会穿透到下面的其他窗口 感谢 nocanstillbb (huang bin bin) 提供的信息

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

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

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

  1. 简单制作任务栏透明背景圆形图标

    一.前言 ps软件很难用,word也试过了,wps,画图都超级难用.最后搞了两个小时,参考百度经验终于搞成了,我们使用美图秀秀软件即可.先看看效果图,我自己使用QT做的教室管理系统. 1.打开软件–& ...

  2. Simple WPF:实现一个透明、无边框、鼠标穿透的WPF窗体

    WPF 透明窗体和鼠标事件穿透 一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能.可以使得透明窗体的鼠标事件穿透到下层,在下层 ...

  3. [MFC] WS_EX_LAYERED 实现透明异形窗口(酷狗歌词、360加速球、窗口边缘阴影)

    关键词:WS_EX_LAYERED. UpdateLayeredWindow PC应用不少都有透明的异形窗口  比如以下程序的效果: 酷狗音乐播放器的歌词窗口(窗口除了歌词内容 其他都是透明的) 36 ...

  4. DUILIB异形窗口实现

    搞Windows程序的人尽皆知分层窗口能够实现很多不错的效果,之前看过一些异形窗口的实现,所以就手痒也想自己搞一个玩一玩.自己动手实现过程才发现还是有不少问题的. 基本思路是: 1.将窗口扩展属性设置 ...

  5. Python生成透明背景图片

    转载请注明出处:http://blog.csdn.net/jinixin/article/details/79115782 关于画图,Python不乏许多优秀的第三方库能支持操作图片,比如Matplo ...

  6. Android设置Activity透明背景样式

    给Activity指定主题样式时,如果activity继承AppCompatActivity,则必须指定theme为Theme.AppCompat或者其子类,否则会报错. 首先,不设置布局文件背景颜色 ...

  7. QT窗口:透明与半透明、不规则异形窗口、控件透明与半透明、不规则异形按钮

    目录 1.不规则异形窗口和控件的代码原理 2.主窗口全透明 3.主窗口半透明(以白里透红为例) 4.不规则异形窗口 5.不规则异形按钮 6.使用样式表实现透明与半透明 1.不规则异形窗口和控件的代码原 ...

  8. 【PIL案例精讲】252行Python代码制作透明背景的电子印章

    Python制作透明背景的电子印章 案例目录 Python制作透明背景的电子印章 一.前言 二.步骤解析 三.源代码和运行效果 1.源代码 2.运行效果图 四.每日一句 一.前言 今天分享一个Pyth ...

  9. gif透明背景动画_iPad Procreate入门笔记03 - GIF动画制作

    更新至Procreate 5 后,新增加了"动画辅助(animation assist)"功能,制作动画更加容易上手且方便了. 下面介绍几种简单的制作方法. 1. GIF最佳画布大 ...

最新文章

  1. A*算法(最佳优先搜索)
  2. XHML教会我的一些东西-5
  3. [转]51汇编指令集详解()
  4. android软件多版本共存,1. android studio 多版本共存(2.2 and 3.3)
  5. java 调用kettle ktr_java调用kettle数据库类型资源库中的ktr
  6. 【深度解局】佛慢你:张小龙的微信成功三字诀
  7. 学习5g通信心得体会_2020世界5G大会最新参观心得体会感悟5篇
  8. bilibili视频流量数据潜望镜
  9. 新能源充电桩控制板迭代升级,打开充电桩行业发展新机遇
  10. 41. Fast File System (FFS)
  11. 【C/C++】scanf,printf 函数
  12. 荣盛发展,或正在步华夏幸福后尘
  13. Git报错error: could not lock config file C:/Program Files/Git/mingw64/etc/gitconfig: Permission denie
  14. Edge 开发者日 · New Bing New Edge
  15. facebook网页版登录_微信网页版关闭登录将影响一大批使用itchat等Web Api方案的微信机器人...
  16. STM32——FSMC(灵活的静态存储器控制器)驱动TFTLCD液晶屏
  17. Autosar MCAL-GTM之TOM
  18. 分布式事务操作之Spring+JTA
  19. 计算机发展史的pdf文档,计算机的发展历程.pdf
  20. 百度游戏娱乐平台-百度的又一个新东西

热门文章

  1. 分割网络对结构光图像进行分割
  2. bitmap file res\xxx.png is not in 3.00 format
  3. CSP-J2022复赛
  4. php ctr b,用PHP解密AES CTR Little Endian
  5. 强大的抓包工具 Fiddler Web Debugger v5.0 中文破解版
  6. EKF-SLAM simulated in MATLAB
  7. IDEA创建maven项目没有src目录问题解决
  8. linux小红帽实验心得,《小红帽》读后感读书心得400字五篇
  9. k3d入门指南:在Docker中运行K3s
  10. 莫道君行早更有早来人(一)黄页