Нарисуйте пунктирную линию в WPF Adorner - PullRequest
11 голосов
/ 01 июля 2010

Я нашел несколько статей в Интернете, касающихся рисования пунктирной линии в WPF.Тем не менее, они, кажется, вращаются вокруг использования Line-класса, который является UIElement в WPF.Это выглядит примерно так:

Line myLine = new Line();
DoubleCollection dashes = new DoubleCollection();
dashes.Add(2);
dashes.Add(2);
myLine.StrokeDashArray = dashes;

Теперь я внутри Adorner, где у меня есть доступ только к контексту рисования.Там я более или менее сведен к примитивам рисования, кистям, ручкам, геометрии и т. Д. Это выглядит примерно так:

var pen = new Pen(new SolidColorBrush(Color.FromRgb(200, 10, 20)), 2);
drawingContext.DrawLine(pen, point1, point2);

Я застрял, как сделать пунктирную линию на этом уровне API,Я надеюсь, что не «рисовать маленькие линии одну за другой», а что-то еще, чего я не видел ...

Ответы [ 2 ]

22 голосов
/ 01 июля 2010

Посмотрите на свойство Pen.DashStyle . Вы можете использовать члены класса DashStyles , которые предоставляют некоторые предопределенные стили штрихов, или вы можете указать свой собственный шаблон штрихов и разрывов, создав новый экземпляр DashStyle .

var pen = new Pen(new SolidColorBrush(Color.FromRgb(200, 10, 20)), 2);
pen.DashStyle = DashStyles.Dash;
drawingContext.DrawLine(pen, point1, point2);
1 голос
/ 12 февраля 2013

Вы не привязаны к примитивам. Если вы следуете этому шаблону, вы можете добавить что-нибудь для рекламодателя.

public class ContainerAdorner : Adorner
{
    // To store and manage the adorner's visual children.
    VisualCollection visualChildren;

    // Override the VisualChildrenCount and GetVisualChild properties to interface with 
    // the adorner's visual collection.
    protected override int VisualChildrenCount { get { return visualChildren.Count; } }
    protected override Visual GetVisualChild(int index) { return visualChildren[index]; }

    // Initialize the ResizingAdorner.
    public ContainerAdorner (UIElement adornedElement)
        : base(adornedElement)
    {
        visualChildren = new VisualCollection(this);
        visualChildren.Add(_Container);
    }
    ContainerClass _Container= new ContainerClass();

    protected override Size ArrangeOverride(Size finalSize)
    {
        // desiredWidth and desiredHeight are the width and height of the element that's being adorned.  
        // These will be used to place the Adorner at the corners of the adorned element.  
        double desiredWidth = AdornedElement.DesiredSize.Width;
        double desiredHeight = AdornedElement.DesiredSize.Height;

        FrameworkElement fe;
        if ((fe = AdornedElement as FrameworkElement) != null)
        {
            desiredWidth = fe.ActualWidth;
            desiredHeight = fe.ActualHeight;
        }

        _Container.Arrange(new Rect(0, 0, desiredWidth, desiredHeight));

        return finalSize;
    }
}
...