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

问题描述 投票:6回答:4

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

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

感谢您参与讨论。

Bonus Reading

wpf zooming magnify
4个回答
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完成它,但由于WPF现在由微软的另一个部门拥有而不是Windows,这种事情似乎在实践中并未发生。)

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

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


3
投票

放大镜应用程序实现自己的缩放图像渲染,这就是你看到像素的原因。 WPF确实使用矢量图形,但在这种情况下,WPF应用程序本身并不是渲染缩放图像。

如果您使用像Snoop这样的东西,您可以看到缩放和缩放的WPF矢量图形渲染。


0
投票

我想,Windows 7放大镜会在屏幕UI上拍摄实际应用程序的快照,然后自行放大(不为WPF应用程序制作特殊情况)。当然它可以访问的只是像素,而不是在场景后面工作的矢量图形。


-1
投票

Windows-7放大镜是基于像素的,但放大模式有所不同,具体取决于Aero主题是否处于活动状态。

  • 使用Aero主题缩放是像素化的。
  • 如果没有Aero主题,缩放会变得平滑(模糊)。

只有Aero主题才能选择其他视图(“Docked”除外)。

© www.soinside.com 2019 - 2024. All rights reserved.