2009-08-26 11 views
6

Ho bisogno di disegnare alcune linee semplici all'interno di un controllo Border (o simile) che si estendono sempre ai limiti del bordo. C'è un modo per allungare solo le linee ma non la sua penna? Senza coinvolgere un sacco di C#?Disegno WPF che si estende senza allungare la penna

In questa versione le linee allungare:

<Border> 
    <Border.Background> 
     <DrawingBrush> 
     <DrawingBrush.Drawing> 
      <DrawingGroup> 
       <GeometryDrawing Brush="Red"> 
        <GeometryDrawing.Geometry> 
        <GeometryGroup> 
         <RectangleGeometry Rect="0,0 100,1000" /> 
         <LineGeometry StartPoint="0,0" EndPoint="100,1000"/> 
         <LineGeometry StartPoint="100,0" EndPoint="0,1000"/> 
        </GeometryGroup> 
        </GeometryDrawing.Geometry> 
        <GeometryDrawing.Pen> 
        <Pen Thickness="20" Brush="Black"/> 
        </GeometryDrawing.Pen> 
       </GeometryDrawing> 
      </DrawingGroup> 
     </DrawingBrush.Drawing> 
     </DrawingBrush> 
    </Border.Background> 
</Border> 

La soluzione migliore che ho venire in mente è questa:

<Border> 
    <Grid> 
     <Path Stretch="Fill" Fill="Red" Stroke="Black" StrokeThickness="4" Data="M0,0 L100,0 100,1000 0,1000 z" /> 
     <Path Stretch="Fill" Stroke="Black" StrokeThickness="4" Data="M 0,0 L0,0 100,1000" /> 
     <Path Stretch="Fill" Stroke="Black" StrokeThickness="4" Data="M 100,0 L100,0 0,1000" /> 
    </Grid> 
</Border> 

Ma non c'è una soluzione migliore? Ciò non comporta Grid extra?

risposta

5

Ho fatto questo scalando dati di un percorso, non il componente visiva.

  1. Posizionare un percorso in una tela.
  2. Impostare path.Data su una Geometria che rappresenta i dati come percentuali dell'intervallo logico.
  3. Impostare path.Data.Transform su un ScaleTransform con ScaleX e ScaleY legati alla larghezza e all'altezza effettive.
+1

Suggerimento davvero accurato! Mi ha salvato di ore di frustrazione o carichi di convertitori. –

1

Nessuno che io conosca. Ma a meno che non si sta facendo qualcosa di veramente stravagante, non è davvero un grande sforzo per ignorare OnRender e disegnare voi stessi:

public class CustomBorder : Border 
{ 
    protected override void OnRender(DrawingContext dc) 
    { 
     base.OnRender(dc); 

     dc.DrawLine(new Pen(BorderBrush, BorderThickness.Top), new Point(0, 0), new Point(ActualWidth, ActualHeight)); 
    } 
} 

Risultato:

enter image description here

+1

Sono sorpreso dal fatto che devo fare il mio controllo per fare una cosa così semplice. – bitbonk

4

All'interno della linea, è è possibile associare la larghezza (o l'altezza, in base al modo in cui si disegna la linea) a quella del contenitore genitore per ottenere ciò che si desidera.

<Grid x:Name="Grid" Margin="10"> 
     <Border BorderBrush="Black" BorderThickness="1" /> 
     <Line X1="0" X2="{Binding ElementName=Grid, Path=ActualWidth}" Y1="1" Y2="1" Stroke="Red" Margin="0,10,0,0" /> 
     <Line X1="0" X2="{Binding ElementName=Grid, Path=ActualWidth}" Y1="1" Y2="1" Stroke="Green" Margin="0,30,0,0" /> 
     <Line X1="0" X2="{Binding ElementName=Grid, Path=ActualWidth}" Y1="1" Y2="1" Stroke="Blue" Margin="0,50,0,0" /> 
    </Grid> 

Edit: Ecco un altro modo senza utilizzare vincolante

<Border BorderBrush="Black" BorderThickness="1" > 
    <Path Stroke="Red" StrokeThickness="1" Data="M0,0 1,0Z" Stretch="Fill" /> 
</Border> 
+0

Hai provato questo in VS 2008 (anche Blend credo)? Il progettista scalerà questo controllo all'infinito. Diventa sempre più grande. Questo perché la linea che è associata alla larghezza effettiva del genitore è leggermente più lunga di ActualWith (si pensi a LineCap ecc.). Ciò causerà un aumento dell'acuto che farà nuovamente aggiornare l'endpoint della linea e così via. – bitbonk

+0

Sembra buono nel mio progettista VS2008. Sembra buono anche quando lo eseguo. – mdm20

+0

Sembra solo che accada se ometti la griglia e la metti direttamente in un controllo utente. – bitbonk

Problemi correlati