2009-08-26 10 views
6

Ich muss einige einfache Linien in einem Rahmensteuerelement (oder ähnlichem) zeichnen, das sich immer an die Grenzen des Rahmens erstreckt. Gibt es eine Möglichkeit, nur die Linien zu strecken, aber nicht den Stift? Ohne viel C# zu involvieren?WPF-Zeichnung, die sich dehnt, ohne den Stift zu strecken

In dieser Version werden die Linien strecken:

<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> 

Die beste Lösung, die ich mit diesem ist gekommen sind:

<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> 

ist aber nicht, dass es eine bessere Lösung? Das beinhaltet kein extra Grid?

Antwort

5

Ich habe dies getan, indem Sie einen Pfad der Daten Skalierung, nicht auf die visuelle Komponente.

  1. Platzieren Sie einen Pfad in einem Canvas.
  2. Setzen Sie path.Data auf eine Geometrie, die Ihre Daten als Prozentsätze des logischen Bereichs darstellt.
  3. Setzen Sie path.Data.Transform auf eine ScaleTransform mit ScaleX und ScaleY, die an die tatsächliche Breite und Höhe gebunden ist.
+1

Wirklich gepflegter Tipp! Sparte mich von Stunden der Frustration oder von vielen Konvertern. –

1

Keine, die ich kenne. Aber wenn Sie etwas wirklich extravagant tun, es ist wirklich nicht viel Mühe OnRender außer Kraft zu setzen und diese selbst zu zeichnen:

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)); 
    } 
} 

Ergebnis:

enter image description here

+1

Ich bin überrascht, dass ich meine eigene Kontrolle für das Machen solch einer einfachen Sache haben muss. – bitbonk

4

Innerhalb einer Linie Sie kann die Breite (oder Höhe, je nachdem, wie Sie die Linie zeichnen) an die des übergeordneten Containers binden, um das zu erreichen, was Sie möchten.

<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: Hier ist eine andere Art und Weise ohne Bindung

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

Haben Sie das in VS 2008 probiert (Blend auch, denke ich)? Der Designer wird eine solche Kontrolle endlos skalieren. Es wird größer und größer. Dies liegt daran, dass die Zeile, die tatsächlich an die ActualWidth des übergeordneten Elements gebunden ist, etwas länger ist als die ActualWith-Zeile (denken Sie an LineCap usw.). Dies führt dazu, dass der Aktualwert erhöht wird, was wiederum dazu führt, dass der Leitungsendpunkt aktualisiert wird und so weiter. – bitbonk

+0

Es sieht in meinem VS2008 Designer gut aus. Sieht gut aus, wenn ich es auch laufe. – mdm20

+0

Es scheint nur zu passieren, wenn Sie das Gitter weglassen und es direkt in ein Benutzersteuerelement einfügen. – bitbonk