Принудительная привязка линий 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