2009-06-26 21 views
28

L'elemento Rectangle ha StrokeDashArray che consente di disegnarlo con trattini, ma non supporta gli angoli arrotondati. Il controllo Border supporta belle linee spesse con angoli arrotondati, ma disegnerà solo linee continue.Come si crea un bordo tratteggiato con angoli arrotondati in WPF?

Qual è il modo migliore per ottenere un bordo tratteggiato con angoli arrotondati, con qualsiasi controllo?

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

risposta

65

vi sbagliate che Rectangle non supporta questa:

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

enter image description here

+0

Il link di immagine sembra essersi rotto. Se hai ancora l'immagine originale, caricala di nuovo su stack.imgur oppure modifica la risposta per farlo funzionare senza l'immagine. Grazie. –

8

controllo WPF Border non supporta le linee tratteggiate. Se si desidera applicare un bordo punteggiato/tratteggiato per un controllo, è possibile semplicemente decorare il controllo con un dispositivo di decorazione.

Ecco la classe campione di adorner. Questo è un generico decoratore per qualsiasi 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); 
    } 
} 

Ho un semplice blocco di testo nel mio XAML ed è contenuto in una griglia di nome 'LayoutGrid'.

Ora, il confine può essere applicato nel codice dietro

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