2010-07-01 15 views
11

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, bei der es sich um ein UIElement in WPF handelt. Es geht ungefähr so:Gestrichelte Linie in einem WPF-Adorner zeichnen

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

Nun, ich bin im Inneren eines Adorner, wo ich nur Zugriff auf eine Zeichnung Kontext haben. Dort bin ich mehr oder weniger auf die Zeichnung Primitiven reduziert, Pinsel, Stifte, Geometrie usw. mehr so ​​aussieht:

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

Ich bin fest, wie auf dieser Ebene der API eine gestrichelte Linie zu tun. Ich hoffe, dass es nicht darauf ankommt, "die kleinen Linien eins nach dem anderen zu zeichnen", sondern etwas anderes, das ich noch nicht gesehen habe ...

Antwort

22

Schauen Sie sich die Pen.DashStyle Eigenschaft an. Sie können entweder Mitglieder der Klasse DashStyles verwenden, die einige vordefinierte Stricharten enthalten, oder Sie können ein eigenes Muster von Gedankenstrichen und Lücken angeben, indem Sie eine neue DashStyle Instanz erstellen.

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

Doh, das ist es, irgendwie habe ich diese Eigenschaft verpasst. Es ist jetzt 35 + ° C in Deutschland :) – flq

1

Sie sind nicht an Primitiven gebunden. Wenn Sie diesem Muster folgen, können Sie einem Adorier etwas 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; 
    } 
}