2010-07-01 9 views
11

J'ai trouvé plusieurs articles sur le Web concernant le dessin d'une ligne en pointillés dans WPF. Cependant, ils semblent tourner autour de l'utilisation de la classe Line, qui est un UIElement dans WPF. Il va quelque chose comme ceci:Dessiner une ligne pointillée dans un adorateur WPF

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

Maintenant, je suis à l'intérieur d'un Adorner, où je ne l'accès à un contexte de dessin. Là, je suis plus ou moins réduite aux primitives de dessin, pinceaux, stylos, la géométrie, etc. Cela ressemble plus que:

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

Je suis coincé comment faire une ligne en pointillés à ce niveau de l'API. J'espère qu'il ne s'agit pas de "dessiner les petites lignes une par une", mais plutôt quelque chose d'autre que je n'ai pas vu ...

Répondre

22

Regardez la propriété Pen.DashStyle. Vous pouvez utiliser des membres de la classe DashStyles qui donnent des styles de tir prédéfinis, ou vous pouvez spécifier votre propre motif de tirets et de trous en créant une nouvelle instance DashStyle.

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

Doh, c'est ça, en quelque sorte j'ai raté cette propriété. Il fait 35 + ° C en Allemagne en ce moment :) – flq

1

Vous n'êtes pas limité aux primitives. Si vous suivez ce modèle, vous pouvez ajouter quelque chose à un adorateur.

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