WPF绘图,伸展而不拉伸笔

时间:2009-08-26 21:18:33

标签: wpf geometry stretch

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

在这个版本中,线条伸展:

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

但是没有更好的解决方案吗?这不涉及额外的网格?

3 个答案:

答案 0 :(得分:5)

我是通过缩放Path的数据而不是可视组件来完成的。

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

答案 1 :(得分: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>

答案 2 :(得分: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