2009-08-26 40 views
6

Tôi cần vẽ một số dòng đơn giản trong một điều khiển Biên giới (hoặc tương tự) luôn kéo dài đến các đường viền của Đường viền. Có cách nào để kéo dài dòng nhưng không phải là bút của nó? Mà không liên quan đến rất nhiều C#?Bản vẽ WPF trải dài mà không kéo dài Pen

Trong phiên bản này các đường căng:

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

Giải pháp tốt nhất mà tôi đã đưa ra là thế này:

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

Nhưng không phải là có một giải pháp tốt hơn? Điều đó không liên quan đến lưới điện thêm?

Trả lời

5

tôi đã thực hiện điều này bằng cách mở rộng quy mô dữ liệu của một con đường, không phải là thành phần thị giác.

  1. Đặt đường dẫn trong Canvas.
  2. Đặt đường dẫn.Data thành Hình học đại diện cho dữ liệu của bạn dưới dạng phần trăm của phạm vi lôgic.
  3. Đặt đường dẫn.Data.Transform thành ScaleTransform với ScaleX và ScaleY được ràng buộc với chiều rộng và chiều cao thực tế.
+1

Mẹo thực sự gọn gàng! Đã lưu cho tôi số giờ thất vọng hoặc vô số người chuyển đổi. –

1

Không ai mà tôi biết. Nhưng trừ khi bạn đang làm một cái gì đó thực sự ngông cuồng, nó thực sự không phải là rất nhiều nỗ lực để ghi đè OnRender và vẽ nó tự hỏi:

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

Kết quả:

enter image description here

+1

Tôi ngạc nhiên rằng tôi phải tự kiểm soát để thực hiện một điều đơn giản như vậy. – bitbonk

4

Trong một dòng, bạn có thể liên kết chiều rộng (hoặc chiều cao, tùy thuộc vào cách bạn đang vẽ đường thẳng) đến vị trí của vùng chứa chính để đạt được những gì bạn muốn.

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

Edit: Đây là một cách khác mà không sử dụng ràng buộc

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

Bạn đã thử điều này trong VS 2008 (Blend quá tôi nghĩ)? Các nhà thiết kế sẽ quy mô như một điều khiển vô tận. Nó trở nên lớn hơn và lớn hơn. Điều này là bởi vì dòng được ràng buộc với ActualWidth của cha mẹ acutally là một chút dài hơn ActualWith (nghĩ LineCap vv). Điều này sẽ làm cho sự mãnh liệt được tăng lên một lần nữa sẽ làm cho điểm cuối dòng được cập nhật và vân vân. – bitbonk

+0

Có vẻ tốt trong thiết kế VS2008 của tôi. Có vẻ ổn khi tôi chạy nó. – mdm20

+0

Nó dường như chỉ xảy ra nếu bỏ qua lưới và đặt nó trực tiếp trong điều khiển người dùng. – bitbonk

Các vấn đề liên quan