2009-08-26 143 views
6

我需要在Border控件(或类似的)内绘制一些简单的线条,这些线条总是伸展到边框的边界。有没有办法只拉伸线条而不是它的笔?不涉及大量的C#?WPF绘图延伸而不伸展笔

在这个版本的线条舒展:

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

我想出了最好的解决办法是这样的:

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

但是是不是有更好的解决办法?那不涉及额外的网格?

回答

5

我已经做到了这一点。

  1. 放置一个路径在画布中。
  2. 将path.Data设置为表示您的数据的几何为逻辑范围的百分比。
  3. 将path.Data.Transform设置为一个ScaleTransform,并将ScaleX和ScaleY绑定到实际的宽度和高度。
+1

真正整洁的提示!我节省了几个小时的挫折或转换器负载。 – 2012-04-10 18:50:12

1

没有我所知道的。但是,除非你正在做的事情真的很奢侈,它真的不是一个很大的努力来覆盖OnRender和自己绘制它:

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

结果:

enter image description here

+1

我很诧异我不得不为自己的控制做这么简单的事情。 – bitbonk 2009-08-26 21:56:29

4

在一条线,你可以将宽度(或高度,取决于您绘制线的方式)绑定到父容器的宽度以实现所需。

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

编辑:这是不使用另一种方式缩放路径的数据,而不是可视组件结合

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

你有没有在VS 2008中尝试过这个(我认为是混合)?设计师将无休止地调整这种控制。它变得越来越大。这是因为与父母的ActualWidth绑定的行比ActualWith稍长(认为LineCap等)。这将导致acutal with被再次增加,这将导致线路端点被更新,等等。 – bitbonk 2009-08-26 21:55:27

+0

我的VS2008设计师看起来很好。当我运行它也看起来很好。 – mdm20 2009-08-26 22:01:51

+0

它似乎只发生,如果省略网格,并将其直接放在用户控件中。 – bitbonk 2009-08-27 07:22:35