2010-07-01 34 views
11

He encontrado varios artículos en la Web sobre dibujar una línea punteada en WPF. Sin embargo, parece que giran alrededor del uso de Line-class, que es un UIElement en WPF. Es algo parecido a esto:Dibujar líneas punteadas en un WPF adorner

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

Ahora, yo estoy dentro de un Adorner, en la que sólo tienen acceso a un contexto de dibujo. No, estoy más o menos reducido a las primitivas de dibujo, pinceles, plumas, geometría, etc. Esto se parece más a lo siguiente:

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

estoy atascado cómo hacer una línea de puntos en este nivel de la API. Espero que no se trata de "dibujar las líneas pequeñas, una por una", sino algo más que no he visto ...

Respuesta

22

Mire la propiedad Pen.DashStyle. Puede usar miembros de la clase DashStyles que ofrecen algunos estilos de guiones predefinidos o puede especificar su propio patrón de guiones y espacios creando una nueva instancia de DashStyle.

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

Doh, eso es todo, de alguna manera me perdí esa propiedad. Son 35 + ° C en Alemania en este momento :) – flq

1

Usted no está atado a primitivos. Si sigues este patrón, puedes agregar cualquier cosa a un adorno.

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