2009-06-26 7 views
28

L'élément Rectangle a StrokeDashArray ce qui lui permet d'être dessiné avec des tirets, mais ne prend pas en charge les coins arrondis. La commande Border prend en charge de belles lignes épaisses avec des coins arrondis, mais dessine uniquement des lignes pleines.Comment créer une bordure en pointillés avec des coins arrondis dans WPF?

Quelle est la meilleure façon de réaliser une bordure en pointillés avec des coins arrondis, avec n'importe quel contrôle?

Example of dashed border http://img524.imageshack.us/img524/3186/dashedborder.png

Répondre

65

Vous vous trompez que Rectangle ne supporte pas:

<Rectangle StrokeDashArray="0.5 1.0 0.3" Stroke="Black" StrokeThickness="2" RadiusX="10" RadiusY="10"/> 

enter image description here

+0

Votre lien image semble avoir rompu. Si vous avez toujours l'image originale, veuillez la réimporter sur stack.imgur, ou modifiez simplement votre réponse pour qu'elle fonctionne sans l'image. Merci. –

8

WPF contrôle des frontières ne prend pas en charge des lignes en pointillés. Si vous souhaitez appliquer une bordure pointillée/pointillée à un contrôle, vous pouvez simplement décorer le contrôle avec un adorateur.

Voici l'exemple de classe adorner. C'est un adorateur générique pour n'importe quel UIelement.

class DottedLineAdorner : Adorner 
{ 
    public UIElement AdornedElement { get; set; } 

    public DottedLineAdorner(UIElement adornedElement) : base(adornedElement) 
    { 
     AdornedElement = adornedElement; 
    } 

    protected override void OnRender(DrawingContext drawingContext) 
    { 
     Size eltSize = (AdornedElement as FrameworkElement).DesiredSize; 
     Pen pen = new Pen(Brushes.Blue, 2) { DashStyle = DashStyles.DashDot }; 
     drawingContext.DrawRoundedRectangle(null, pen, new Rect(0, 0, eltSize.Width, eltSize.Height), 10, 10); 
    } 
} 

J'ai simple textblock dans mon XAML et il est contenu dans une grille nommée « LayoutGrid ».

Maintenant, la frontière peut être appliqué dans le code derrière

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     AdornerLayer.GetAdornerLayer(LayoutGrid).Add(new DottedLineAdorner(textblock)); 
    } 
Questions connexes