SnapsToDevicePixels问题

时间:2011-09-28 09:05:56

标签: wpf

在我的WPF应用程序中,我创建了几个Line元素并添加到StackPanel中。所有线条的厚度均设为0.5。但是当我渲染它时,有时候几条线条看起来很模糊。我尝试在StackPanel中设置SnapsToDevicePixels,但这会使线条完全不可见。现在,如果我将线条粗细增加到1或大于1,那么SnapsToDevicePixels正常工作。

我正在创建Line,如下所示:

private void CreateLine(Double y1, Double y2, Double x1, Double x2, Double width, Double height)
{
    Line line = new Line() { Y1 = y1, Y2 = y2, X1 = x1, X2 = x2, Width = width, Height = height };
}

这里,如果LineThickness设置为0.5,则x1和x2值将为0.25(LineThickenss / 2),宽度为0.5(LineThickness)。

为了使SnapsToDevicePixels在WPF中工作,是否需要设置任何最小像素值?

3 个答案:

答案 0 :(得分:4)

我使用SnapToDevicePixels来解决我的许多UseLayoutRounding问题:

在你的情况下:

<StackPanel UseLayoutRounding="True">
    ...
</StackPanel>

我不知道这是否会解决您的问题,但根据我的经验,值得一试!

答案 1 :(得分:1)

不,本身没有最低限度。您遇到的模糊是由于WPf如何处理绘图。根据我的经验,你无法真正做任何事情。 Snapping to device pixels可能会有一些缓解,但仍然无法预测。

像素和WPF单元之间也存在差异,使事情变得更复杂,尽管有许多技术可以在它们之间进行转换。

将像素转换为WPF单元的常用方法是:

Matrix m = PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice;
double dpiFactor = 1/m.M11;
double lineThickness = dpiFactor * 1;   // Repace '1' with desired pixel size.

以下是有关该主题的有用文章: http://www.wpftutorial.net/DrawOnPhysicalDevicePixels.html

答案 2 :(得分:1)

不建议设置小数位置。

什么意味着WPF的一半点? WPF将1点解释为1/96英寸。不同的显示器(96 DPI,300 DPI)的像素不同。

WPF将普通显示器中的1点视为1像素,96 DPI。和 UIElement.SnapsToDevicePixels效果很好。它尝试将0.5像素捕捉到监视器网格。有两个结果:放大版本2一个像素或缩短版本到0像素(消失)。

如果由于某种原因需要精确的1个像素(而非1个点)定位,请使用GuidelineSet

使用.NET 4或更高版本时,最好使用Layout Rounding。它在UI位置测量级别计算像素偏移。虽然SnapsToDevicePixels适用于渲染级别。 Layout Rounding的减号是动态移动不好。