【问题标题】:Why do I see pixels when zooming WPF application in Windows?为什么在 Windows 中缩放 WPF 应用程序时会看到像素?
【发布时间】:2011-05-16 13:48:04
【问题描述】:

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

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

感谢您参与讨论。

阅读奖励

【问题讨论】:

    标签: wpf zooming magnify


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      回到 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 完成,但由于 WPF 现在由 Microsoft 的不同部门拥有,而不是 Windows,这种事情在实践中似乎不会发生。)

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

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

      【讨论】:

      • 哇,这么完整的答案!做得好,感谢您的澄清!
      • 一个非常彻底的答案,+1!真是太可惜了,这是一个了不起的功能,我认为我们只需 5 分钟就可以在操作系统级别为每个窗口单独更改缩放并且没有模糊......哦,可以做梦了。跨度>
      • 我实际上是从 Griffiths 先生的 Pluralsight 视频中来到这里的,他在视频中展示了放大镜在 Vista 上的效果,发现它在 Windows 10 上对我不起作用 - 只是为了找到更新伊恩本人在 StackOverflow 上 - 很好!
      • 很高兴为您服务!
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 感谢您的回答。你是否同意微软以这种方式开发放大镜应用程序有点愚蠢,同时推广和推动自己的新 UI 渲染范式 (WPF),并吹嘘 Windows Vista 和 Windows 7 UI 是使用这种方式开发的。同时?
        • @Boris 不幸的是,放大镜应用程序无法专门处理 WPF。鉴于 Snoop 做了类似的事情,它看起来确实可行,尽管它只缩放单个应用程序。不过我想说的是,WPF 在 Windows Vista 和 Windows 7 操作系统的 UI 中使用最少。
        • @chibacity 你说得对。好吧,我个人认为这是一种耻辱。我认为 WPF 很棒,而且我知道微软的内部政策是多么乏味。因此,对我来说,不接受像 WPF 这样相当进步的东西是没有意义的。
        • 大家,请随时在 cmets 中发表您对该主题的看法。我想听听开发人员的想法,尤其是那些与 UI 开发密切相关的人:在您看来,WPF 是要走的路吗?我投一票赞成。
        • @Boris 我建议为此提出一个新问题。但是,很难以一种不会很快结束的方式询问它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 2021-11-23
        • 2010-12-18
        相关资源
        最近更新 更多