2009-08-26 2 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를 데이터를 논리 범위의 백분율로 나타내는 Geometry로 설정하십시오.
  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 think)? 디자이너는 끝없이 그러한 컨트롤을 확장합니다. 그것은 점점 커집니다. 이것은 부모의 ActualWidth에 연결되는 선이 ActualWith보다 약간 길기 때문입니다 (LineCap 등을 생각하십시오). 이것은 acutal을 증가시켜 다시 라인 엔드 포인트를 갱신하게합니다. – bitbonk

+0

내 VS2008 디자이너에서 잘 보입니다. 내가 그것을 실행할 때 잘 보인다. – mdm20

+0

그리드를 생략하고 사용자 정의 컨트롤에 직접 배치하는 경우에만 발생하는 것처럼 보입니다. – bitbonk