WPF绘图上下文似乎忽略了SnapToDevicePixels

19

我正在通过对DrawingContextDrawLine直接调用来绘制图表。由于我想避免任何反锯齿功能,我尝试在父级UIElement上设置SnapToDevicePixels=true,但我仍然有反锯齿:

图片描述

这个项目是一个旧的操作系统项目,不是为WPF4编写的,但我将其重新定位到Framework4,这也可能是一个问题吗?

3个回答

17

5

你的建议实际上是有效的。为了生成适当的指南,我必须考虑我将绘制的所有坐标,甚至要添加一半的笔宽。这会生成非常混乱的代码(编写此类代码是一场噩梦)。难道没有什么捷径吗? - Felice Pollano
@Felice Pollano:我什么也没找到 :( 即使是框架类也使用原始解决方案“new GuidelineSet -> GuidelineSet.Add -> PushGuidelineSet”。例如,看一下TickBar类的OnRender方法。 - Marat Khasanov
谢谢回复。实际上我正在查看结果,不知道是否使用抗锯齿更好... - Felice Pollano

3

GuidelineSet旨在解决您的问题。

@Marat Khasanov建议您使用GuidelineSet,而您回复说它会破坏您的代码。我也遇到了这个问题,因此我编写了下面的代码来解决这个问题,而且代码不会很丑陋。

注意:即使在Viewbox中,该方法也有效。

public static class SnapDrawingExtensions
{
    public static void DrawSnappedLinesBetweenPoints(this DrawingContext dc,
        Pen pen, double lineThickness, params Point[] points)
    {
        var guidelineSet = new GuidelineSet();
        foreach (var point in points)
        {
            guidelineSet.GuidelinesX.Add(point.X);
            guidelineSet.GuidelinesY.Add(point.Y);
        }
        var half = lineThickness / 2;
        points = points.Select(p => new Point(p.X + half, p.Y + half)).ToArray();
        dc.PushGuidelineSet(guidelineSet);
        for (var i = 0; i < points.Length - 1; i = i + 2)
        {
            dc.DrawLine(pen, points[i], points[i + 1]);
        }
        dc.Pop();
    }
}

OnRender方法中调用该方法,并将线条的点传递给它。

protected override void OnRender(DrawingContext dc)
{
    // Draw four horizontal lines and one vertical line.
    // Notice that even the point X or Y is not an integer, the line is still snapped to device.
    dc.DrawSnappedLinesBetweenPoints(_pen, LineThickness,
        new Point(0, 0), new Point(320, 0),
        new Point(0, 40), new Point(320, 40),
        new Point(0, 80.5), new Point(320, 80.5),
        new Point(0, 119.7777), new Point(320, 119.7777),
        new Point(0, 0), new Point(0, 120));
}

以下是视图框中的渲染结果: 截取的结果


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