最近在做一个关于医疗项目的软件,使用wpf开发。由于不确定目标客户的Window版本,所以尽量兼容XP以后所有Window系统。最后在测试过程中发现一个问题,在XP系统下,部分控件显示不全,更专业的描述就是部分控件透明。这一现象在其他Window系统并未发现。后来经过查阅资料才发现是WPF硬件加速的问题。
WPF硬件加速工作原理
硬件加速就是利用硬件来替代软件算法以充分利用硬件所固有的快速运算的特性。说白了就是操作系统在渲染UI时,利用GPU代替CPU做大量浮点型运算。
WPF从以下三个层次上来利用硬件加速的特性:
WPF API首先检测你的硬件系统所支持的硬件加速的等级,比如显卡的显存大小,像素深度等等。基于你所使用的硬件,WPF将从以下三种渲染模式中的选择一种作为其渲染模式:
- 第0级
如果你的显卡不支持硬件加速,WPF将采用第0级渲染模式。也就是说它将使用软件加速。这相当于使用低于7.0版本的DirectX。
- 第1级
如果你的显卡部分地支持硬件加速,那么WPF将采用第1级渲染模式。这相当于使用版本号在7.0到9.0之间的DirectX。
- 第2级
如果你的显卡完全支持硬件加速,那么WPF将采用第2级渲染模式。这相当于使用版本号等于或者大于9.0的DirectX。
解决方案
方案一、关闭XP硬件加速
同时按住Win+R键,输入dxdiag,弹出如图所示的界面,将配置与红色方框一致即可。
方案二、WPF代码禁用硬件渲染
在App.cs的Main函数中添加代码
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly
即可,完整代码如下
using System; using System.Windows; using System.Windows.Interop; using System.Windows.Media; class App { [STAThread] public static void Main(params string[] args) { RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; Application app = new Application(); app.Run(new Window1()); } }
关于WPF的Rendering,我会在以后的博文中介绍。
文章评论