Принудительная привязка линий DrawingContext к границам пикселей

Я рисую график в приложении WPF, но линии нарисованы с использованием drawingContext.DrawLine(...) нарисованы до субпиксельных границ.

Я могу заставить их выглядеть красиво, создавая Line объекты, но я не хочу создавать десятки тысяч таких каждый раз, когда визуал становится недействительным.

Как я могу заставить их соответствовать пикселям?

2 ответа

Решение

Вы можете нарисовать линии в производном DrawingVisual, для которого защищенное свойство VisualEdgeMode имеет значение EdgeMode.Aliased:

public class MyDrawingVisual : DrawingVisual
{
    public MyDrawingVisual()
    {
        VisualEdgeMode = EdgeMode.Aliased;
    }
}

public class DrawingComponent : FrameworkElement
{
    private DrawingVisual visual = new MyDrawingVisual();

    public DrawingComponent()
    {
        AddVisualChild(visual);

        using (DrawingContext dc = visual.RenderOpen())
        {
            dc.DrawLine(new Pen(Brushes.Black, 1d), new Point(100, 100), new Point(100, 200));
            dc.DrawLine(new Pen(Brushes.Black, 1d), new Point(105.5, 100), new Point(105.5, 200));
            dc.DrawLine(new Pen(Brushes.Black, 1d), new Point(112, 100), new Point(112, 200));
        }
    }

    protected override int VisualChildrenCount
    {
        get { return 1; }
    }

    protected override Visual GetVisualChild(int index)
    {
        return visual;
    }
}

Как ни странно, но звонит RenderOptions.SetEdgeMode(visual, EdgeMode.Aliased) на непроизведенном DrawingVisual не делает работу.

Замечательно.

Другой вариант (в этом случае более сложный) использует RenderOptions.SetEdgeMode для DrawingGroup:

/questions/10682986/drawingcontextdrawline-pero-ne-imeet-polnoj-neprozrachnosti/10683000#10683000

Другие вопросы по тегам