在WPF 4.0中,何时应使用SnapsToDevicePixels?

71

有人能提供一个指南,说明在 WPF 4.0 中何时使用 SnapsToDevicePixels 吗?

应该仅在出现问题时偶尔使用它,或者在整个应用程序中大量使用,还是仅在某些控件上使用它?


4
我认为整洁清晰的线条可以让你的应用程序显得专业且修剪过的。所以,我的建议是在任何有助于实现这个目标的地方都要使用它。 - cplotts
4个回答

98

Spencer和Martin对于何时对齐像素的答案非常好。

至于如何:我还要指出,在WPF 4.0中,应该尝试使用属性UseLayoutRounding而不是SnapsToDevicePixels

UseLayoutRounding使您所做的与Silverlight兼容(SnapsToDevicePixels在Silverlight中不可用)...并且Microsoft也鼓励在其documentation中使用UseLayoutRounding而不是SnapsToDevicePixels

两者之间的区别是什么?嗯,一个重大的区别是UseLayoutRounding发生在布局阶段,而SnapsToDevicePixels发生在呈现阶段。这使我推测UseLayoutRounding可能是一种更高效的方法(虽然我没有确认过)。

尽管如此,仍有理由使用SnapsToDevicePixels。实际上,MSDN文档指向了其中的一个原因。我将再添加一个原因:只有使用SnapsToDevicePixels才能使用准确控制的指南。

以下是有关此问题(即像素捕捉和图像、文本和视觉清晰度)的一些资源:

嘿。我知道我的答案有点超出你的要求...但是这个概念(即分辨率独立性及其带来的问题以及如何克服它们)在使用WPF时通常会成为挫败的点。至少,我想指向新的WPF 4.0属性UseLayoutRounding

更新

我必须补充一下,因为我已经反复看到这种情况...有时候SnapsToDevicePixels可以在UseLayoutRounding不起作用时发挥作用。我希望我能找到原因,但首先请尝试使用UseLayoutRounding,如果这不起作用,请毫不犹豫地尝试SnapsToDevicePixels

那行代码太锋利了,可能会割伤你!


在许多情况下,“更多=更好”是对我一直以来提出的许多问题的很好的回答,特别是因为我开始感觉最好将我的WPF / Linq to SQL应用程序移植到Silverlight / Linq to EF。 - Mike B
1
@Peretz 可能不会明显...但打开它确实需要做/计算一些事情。也许如果你有很多视觉效果,效果会更明显。然而,更可能的是,性能损失会在通常的糟糕性能中丢失。 - cplotts

8

一个情况是,如果你正在显示图片或视频。如果你不粘合到设备像素(即视频屏幕的像素),那么一些算法(插值,抗锯齿)将用于将图像像素“放置在”屏幕像素之间,所显示的内容看起来不会像原始图像一样好。图像会失去一些锐度。


8

它应该用于对像素放置有意义的控件或区域。绘图应用程序画布相关的控件就是一个例子。你见过碎片化驱动器的地图吗?这可能是另一个例子。

我能想到的一个例外是当你使用某种分隔线时。大多数人期望边框线是实心的。如果关闭此设置,它们可能会看起来模糊和分散注意力。

基本上,如果模糊的边缘=不好,那么就打开它


12
您可能的意思是“如果边缘模糊-打开它”(将 SnapsToDevicePixels 设置为 true 来消除模糊)。 - Sinatr

4

刚刚注意到这对边框非常有用。更多信息请参见这里

<Style TargetType="Border" >
        <Setter Property="SnapsToDevicePixels" Value="True" />
</Style>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接