WPF基于矢量的界面

问题描述 投票:1回答:2

我正在使用WPF开发一个新的C#应用​​程序。我的印象是WPF是基于矢量的,文本/按钮将以独立于分辨率的方式绘制。在运行我的应用程序时,很明显我的应用程序不是使用向量绘制的。有些文字变得相当块状,当使用Windows放大镜时,你可以看到一切都是粗糙的边缘。

在我的应用程序中需要做一些特殊的事情来打开矢量绘图吗?或者我的特定机器出了什么问题? (我正在使用最新的图形驱动程序运行Windows Vista x64)

.net wpf
2个回答
4
投票

我打算将此作为评论添加,但我希望它被正确引用和脚注。

Windows Vista中的Mangifier可访问性工具曾经是WPF感知的。如果您缩放WPF内容,您会看到该应用程序的大幅放大版本 - 证明WPF确实是基于矢量的。

Tim Sneath,微软的技术传播者,qazxsw poi:

6/25/2011:原始图像消失了。替换为显示相同效果的另一个图像。

Greg Schechter blogged about this in 2006解释说放大镜不再有这个技巧。放大镜将专门检测WPF应用程序,并知道如何让它们自我缩放。他们在放大镜中取消了对WPF的依赖。似乎放大镜对WPF中的某些东西有依赖性,他们想要带走或者去除它们:

'bp'和'Joseph Cooney'都注意到使用内置的OS放大镜放大WPF内容不再对内容进行分辨率独立缩放。

这种观察是正确的。

由于一系列无法​​在此描述的变化,操作系统放大镜不再是“WPF感知”,并且像其他内容一样进行位图缩放。虽然我们确实失去了这个功能,但我们相信,如果没有依赖关系使Magnifier能够以WPF特定的方式工作,我们可以更加灵活地为WPF客户提供前进的功能。

请注意,上述内容仅与进程外放大率有关。当您在自己的WPF应用程序中进行缩放(通过缩放)时,渲染将继续以更高的比例重新栅格化,因此在最常见的场景中一切都保持平滑。此更改严格来说使用外部放大镜。

所以放大镜曾经拥有它,但不再拥有它。


在Channel 9视频“answers some commenters on this blog”中,Greg Schechter谈到了Magnifier如何提供这种功能。

放大镜和DWM一起工作。放大镜修改了DWM场景图,使其客户区实际指向场景图的桌面根。然后DWM知道放大镜在那里并且知道如何避免那种可怕的“将摄像机指向电视机上显示摄像机”的效果。


编辑:9/7/2018。来自Greg Schechter: Windows Presentation Foundation(WPF) Architecture

当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发布时。正如你所见,结果就是放大并不像过去那么有趣。


0
投票

Vista中的放大镜并不是特别聪明。它只会从屏幕上炸掉已经光栅化的图像。要查看文本框实际上是基于矢量的,请尝试Ian Griffiths' answer:

编辑:从评论,似乎Vista中的放大镜毕竟应该做矢量缩放。它肯定不在这台电脑上(Vista 32位),所以我可能遇到同样的问题。 DPI缩放工作,但......

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