6

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>

しかし、より良い解決策はありませんか?それは余分なグリッドを必要としませんか?

4

3 に答える 3

5

これは、ビジュアル コンポーネントではなく、パスのデータをスケーリングすることで行いました。

  1. キャンバスにパスを配置します。
  2. path.Data を、データを論理範囲のパーセンテージとして表す Geometry に設定します。
  3. path.Data.Transform を ScaleTransform に設定し、ScaleX と ScaleY を実際の幅と高さにバインドします。
于 2010-12-06T22:14:03.167 に答える
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>
于 2009-08-26T21:33:23.177 に答える
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));
    }
}

結果:

ここに画像の説明を入力

于 2009-08-26T21:25:00.370 に答える