我正在使用C#创建一个WPF应用程序,我正处于为它开发更多UI的阶段。我将所有组件(如TextBlocks和其他画布)放在主Canvas中,但如果我拖动它的左侧以腾出更多空间,它会在右侧展开,这意味着我必须将所有内容都移动。当我尝试扩展顶部时会发生同样的事情;底部变大了。我将Canvas的RenderTransformOrigin设置为0,0所以我不太确定发生了什么。任何帮助表示赞赏。 谢谢!
答案 0 :(得分:0)
默认情况下,Canvas没有宽度或高度,其实际大小取决于您是否明确设置了这些属性,或者将HorizontalAlignment或VerticalAlignment设置为Stretch
。
在任何一种情况下,Canvas内部的元素都相对于其左上角对齐,除非您明确设置了Canvas.Top
,Canvas.Left
,Canvas.Right
和/或{{ 1}}属性。
您还可以通过其绝对几何坐标来定位包含几何的元素(如Canvas.Bottom
的导数,Path是常见示例)。实际上,这已经是它们呈现的方式。
关于你在问题中的评论,通常你不会改变相对于画布的位置,因为它更容易(我认为甚至推荐)重新定位画布本身,所以它所包含的一切也将被重新定位。
常见的方法是在Canvas中添加元素,然后将Canvas放在另一个“父”Canvas中,类似于CorelDraw / Inkscape / Illustrator等矢量设计程序中的“分组”。
另一种方法是使用包含要重新定位的元素的Canvas的Shape
属性。
在您习惯将Canvas视为“坐标系”之后,您可以而且应该将Canvas-inside-Canvas-inside-Canvas -...想象成一种对共享相同笛卡尔空间的事物进行分层分组的方法,而不是Panels和ContentControls,它们彼此嵌套,通常不能共享空间。
答案 1 :(得分:0)
就像我在评论中所说的那样,画布内的所有控件都是相对于画布定位的。左上角。如果你希望他们保留他们的位置"当画布调整到左侧或顶部时,您需要自己抵消它们。您可以使用在要调整画布大小时调用的实用程序方法来执行此操作:
public static void StretchWidthLeft(Canvas canvas, double newWidth)
{
double diff = newWidth - canvas.Width;
canvas.Width = newWidth;
foreach (UIElement child in canvas.Children)
{
Canvas.SetLeft(child, Canvas.GetLeft(child) + diff);
}
}
public static void StretchHeightTop(Canvas canvas, double newHeight)
{
double diff = newHeight - canvas.Height;
canvas.Height = newHeight;
foreach (UIElement child in canvas.Children)
{
Canvas.SetTop(child, Canvas.GetTop(child) + diff);
}
}
请注意,这些方法不会重新定位画布本身。你将如何做到这一点取决于画布如何'父母正在维持自己的地位。