我想在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中的矩形具有固有的位置,比如一条线,还是我必须自己滚动(使用直线)?
答案 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中的位置是相对的,这引出了一个问题:坐标相对于什么?
Line
,Rectangle
和Path
都继承自Shape
,对于任何Shape
对象,定义几何的坐标均为相对于Shape
本身的左上角。因此,当您从Line
到(100, 300)
创建(300, 100)
对象时,结果元素的大小为300x300
个点,即使可见行的边界为200x200
}:
在这种情况下,没有必要将Line
放在Canvas
内,因为您没有使用Canvas
的坐标系。
某些形状(如Line
和Path
)允许您将几何体放置在您喜欢的任何“内部”坐标上。其他人,例如Rectangle
和Ellipse
,总是在内部将定义几何定位在(0, 0)
,迫使您使用其他布局属性将形状定位在更大的场景中(例如Canvas.Top/Left
},Margin
等。)。
在您的示例中,如果您要定义Rectangle
个200x200
点,并使用Canvas
附加属性将矩形定位在(100, 100)
,则生成{ {1}}元素会衡量Rectangle
,而父200x200
会衡量自己至少Canvas
,这可以说更直观:
你是对的,因为这是相当不一致的。您可能会发现始终使用布局属性(例如300x300
)来定位场景中的形状以使所有元素都使用相同的坐标系是很有用的。