对于在WPF

时间:2015-12-30 16:28:40

标签: c# wpf canvas

我想在WPF中的画布上绘制一个矩形。为了绘制一条线,我可以这样做:

line.X1 = ls.P0.X;
line.Y1 = ls.P0.Y;
line.X2 = ls.P1.X;
line.Y2 = ls.P1.Y;          

MyCanvas.Children.Add(line);

...换句话说,该位置是该行本身的属性。我想以相同的方式绘制一个矩形,即分配其坐标并将其添加到我的画布。但到目前为止,我在网上看到的例子看起来像这样:

rect = new Rectangle
{
    Stroke = Brushes.LightBlue,
    StrokeThickness = 2
};
Canvas.SetLeft(rect,startPoint.X);
Canvas.SetTop(rect,startPoint.X);
canvas.Children.Add(rect);

...换句话说,它看起来并不像矩形具有固有的位置,而是通过调用Canvas的方法来设置它的位置。这是真的 - 线条有固有的坐标但是矩形没有?有没有办法让WPF中的矩形具有固有的位置,比如一条线,还是我必须自己滚动(使用直线)?

2 个答案:

答案 0 :(得分:1)

您可以使用Path RectangleGeometry这样的控件:

var rect = new Path
{
    Data = new RectangleGeometry(new Rect(x, y, width, height)),
    Stroke = Brushes.LightBlue,
    StrokeThickness = 2
};
canvas.Children.Add(rect);

答案 1 :(得分:0)

  

...换句话说,它看起来不像矩形具有固有的位置,而是通过调用Canvas的方法来设置它的位置。这是真的 - 线条有固有的坐标但是矩形没有?

WPF中的位置是相对的,这引出了一个问题:坐标相对于什么?

LineRectanglePath都继承自Shape,对于任何Shape对象,定义几何的坐标均为相对于Shape本身的左上角。因此,当您从Line(100, 300)创建(300, 100)对象时,结果元素的大小为300x300个点,即使可见行的边界为200x200 }:

Line Diagram

在这种情况下,没有必要将Line放在Canvas内,因为您没有使用Canvas的坐标系。

某些形状(如LinePath)允许您将几何体放置在您喜欢的任何“内部”坐标上。其他人,例如RectangleEllipse,总是在内部将定义几何定位在(0, 0),迫使您使用其他布局属性将形状定位在更大的场景中(例如Canvas.Top/Left },Margin等。)。

在您的示例中,如果您要定义Rectangle200x200点,并使用Canvas附加属性将矩形定位在(100, 100),则生成{ {1}}元素会衡量Rectangle,而父200x200会衡量自己至少Canvas,这可以说更直观:

Diagram 1
(为清晰起见添加了阴影)

你是对的,因为这是相当不一致的。您可能会发现始终使用布局属性(例如300x300)来定位场景中的形状以使所有元素都使用相同的坐标系是很有用的。