2009-08-26 18 views
6

Necesito dibujar algunas líneas simples dentro de un control de borde (o similar) que siempre se extienden hasta los límites del borde. ¿Hay alguna manera de estirar las líneas solamente pero no su pluma? Sin involucrar un montón de C#?Dibujo WPF que se extiende sin estirar la pluma

En esta versión las estrías:

<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 mejor solución que he llegado con esto es:

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

Pero no hay una solución mejor? Eso no implica Grid extra?

Respuesta

5

He hecho esto mediante el escalado de datos de un camino, no el componente visual.

  1. Coloque una ruta en un lienzo.
  2. Establezca path.Data en una geometría que represente sus datos como porcentajes del rango lógico.
  3. Establezca path.Data.Transform en un ScaleTransform con ScaleX y ScaleY vinculado al ancho y el alto reales.
+1

¡Extremidad realmente aseada! Me ahorró horas de frustración o muchos convertidores. –

1

Nada que yo sepa. Pero a menos que usted está haciendo algo realmente extravagante, en realidad no es mucho esfuerzo para anular OnRender y dibujar usted mismo:

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

Resultado:

enter image description here

+1

Me sorprende que tenga que usar mi propio control para hacer algo tan simple. – bitbonk

4

Dentro de una línea, puede vincular el ancho (o la altura, dependiendo de la forma en que esté dibujando la línea) con el del contenedor principal para lograr lo que desea.

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

Editar: Aquí es otra forma sin usar vinculante

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

¿Has probado esto en VS 2008 (Blend también, creo)? El diseñador escalará tal control sin fin. Se vuelve más y más grande. Esto se debe a que la línea que está unida al realWidth de la matriz es un poco más larga que la realWith (piense en LineCap, etc.). Esto causará que se incremente el flujo sanguíneo, lo que nuevamente hará que se actualice el punto final de la línea, y así sucesivamente. – bitbonk

+0

Se ve bien en mi diseñador VS2008. Se ve bien cuando lo ejecuto también. – mdm20

+0

Parece suceder solo si se omite la cuadrícula y se coloca directamente en un control de usuario. – bitbonk

Cuestiones relacionadas