2009-08-26 17 views
6

境界線の境界に常に伸びている境界線コントロール(または同様のもの)内に単純な線を描く必要があります。線だけを伸ばす方法はありますが、ペンは伸ばすことはできませんか?たくさんの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をScaleXとScaleYを実際の幅と高さにバインドしてScaleTransformに設定します。
+1

本当にきちんとした先端!時間を節約したり、多くのコンバーターを救ってくれました。 –

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

私はそのような単純なことをするために自分のコントロールをwirteしなければならないと誇張されています。 – bitbonk

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でこれを試してみましたか(Blend too I think)?設計者はこのようなコントロールを無限に拡張します。それはますます大きくなります。これは、親のActualWidthに結ばれている行がActualWithより少し長いためです(LineCapなどと思う)。これにより、acutalが増加して再びラインエンドポイントが更新されるようになります。 – bitbonk

+0

私のVS2008デザイナーではうまく見えます。私もそれを実行するときに見えます。 – mdm20

+0

グリッドを省略し、それをユーザコントロールに直接配置するだけであると思われます。 – bitbonk

関連する問題