11 Stimmen

Gestrichelte Linie in einer WPF-Verzierung zeichnen

Ich habe mehrere Artikel im Web über das Zeichnen einer gestrichelten Linie in WPF gefunden. Sie scheinen sich jedoch um die Verwendung der Line-Klasse zu drehen, die ein UIElement in WPF ist. Es geht etwa so:

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

Jetzt befinde ich mich in einem Adorner, wo ich nur Zugriff auf einen Zeichnungskontext habe. Dort bin ich mehr oder weniger auf die Zeichnungsprimitive, Pinsel, Stifte, Geometrie usw. reduziert. Das sieht eher so aus:

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

Ich weiß nicht, wie ich eine gestrichelte Linie auf dieser Ebene der API erstellen kann. Ich hoffe, es liegt nicht an "die kleinen Linien eine nach der anderen zeichnen", sondern eher an etwas anderem, das ich noch nicht gesehen habe...

26voto

Samuel Jack Punkte 31654

Sehen Sie sich die Stift.DashStyle Eigentum. Sie können entweder Mitglieder der DashStyles Klasse, die einige vordefinierte Bindestriche enthält, oder Sie können Ihr eigenes Muster von Bindestrichen und Lücken angeben, indem Sie eine neue DashStyle Instanz.

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

2voto

Lee Louviere Punkte 5066

Sie sind nicht an Primitive gebunden. Wenn Sie dieses Muster befolgen, können Sie alles zu einer Verzierung hinzufügen.

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;
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X