6

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

在 Windows 7 ( 中运行我的应用程序和使用放大镜应用程序进行缩放时Win key + Plus key,放大的 GUI 显示像素。我可能错了,因为我无法解释它,但 WPF 不应该提供类似控件渲染的矢量吗?

感谢您参与讨论。

奖金阅读

4

4 回答 4

18

回到 Vista 首次发布时,以及 WPF 版本 3.0 上,使用内置放大镜进行缩放实际上会进行基于矢量的缩放。

这在 WPF 3.5 服务包 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 中,有问题的新功能是支持自定义像素着色器。为此,微软必须发布 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 的渲染不再像 Vista 发布时那样与 Windows 紧密集成。结果是,正如你所见,放大不再像以前那么有趣了。

于 2010-11-29T01:32:13.437 回答
3

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

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

于 2010-11-27T14:17:43.137 回答
0

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

于 2010-11-27T14:18:02.797 回答
-1

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

  • 使用 Areo 主题,缩放是像素化的。
  • 没有 Areo 主题,缩放会平滑(模糊)。

只有使用 Areo 主题才能选择其他视图(“停靠”除外)。

于 2014-12-19T11:22:18.527 回答