为什么在Windows中缩放WPF应用程序时会看到像素?

Bor*_*ris 6 wpf zooming magnify

我使用WPF为随机应用程序开发了一个GUI.我在应用程序窗口中放置了一堆开箱即用的WPF控件.我没有定制任何东西,没有使用位图等.

当在Windows 7中运行我的应用程序并使用放大镜应用程序进行缩放时(Win key + Plus key放大的GUI显示像素.我可能错了,因为我不能解释它,但是不是WPF应该提供控件渲染一样的矢量

感谢您参与讨论.

奖金阅读

Ian*_*ths 18

当Vista首次出货时,以及当WPF在3.0版本上时,使用内置放大镜进行缩放实际上会进行基于矢量的缩放.

出现WPF 3.5 Service Pack 1时,此操作停止了.(它在sp1之前的3.5版本中工作.)之前它工作的原因是DWM(桌面窗口管理器) - Windows的一部分负责呈现你在屏幕上看到的所有内容 - 使用MILCORE.DLL进行渲染.WPF 3.0和3.5版本也使用相同的组件进行渲染 - 这意味着所有WPF内容都是本机内容,可以这么说.(实际上,在没有DWM的Windows XP上,MILCORE.DLL是WPF为了自己的利益而放在你的系统上的东西.但它内置于Vista和Windows 7中.)当WPF使用MILCORE.DLL时在Vista上渲染,DWM应用的任何效果(如缩放)也会以您希望的方式应用于WPF - 它确实在没有像素化的情况下进行缩放.

不幸的是,情况已不再如此.原因是WPF开始添加新的渲染功能.在3.5 sp1中,有问题的新功能是支持自定义像素着色器.为此,Microsoft必须发布MIL的更新.(媒体集成层 - 执行实际渲染的位.)但是,它们并不能真正更新MILCORE.DLL,因为它是Windows的一部分 - 它就是你在屏幕上看到的所有内容都会出现在屏幕上.有效发布新版本的MILCORE.DLL意味着推出Windows更新.Windows的发布时间表与.NET的发布时间表无关,因此WPF团队合理添加新功能的唯一方法是发布新的MIL.(理论上他们可以通过Windows Update完成它,

从.NET 3.5 sp1开始,MIL位于另一个名为wpf_gfx_vXXXX.dll的DLL中,其中vXXXX是版本号.在.NET 4.0中,它是wpf_gfx_v0400.dll.

好处是WPF可以为每个新版本添加新的渲染功能,而无需更新Windows本身.缺点是WPF的渲染不再像Windows那样与Vista紧密集成,而是在Vista发布时.正如你所见,结果就是放大并不像过去那么有趣.