WPF Canvas只扩展到了正确的位置?

时间:2017-01-12 02:02:50

标签: c# wpf windows canvas transform

我正在使用C#创建一个WPF应用程序,我正处于为它开发更多UI的阶段。我将所有组件(如TextBlocks和其他画布)放在主Canvas中,但如果我拖动它的左侧以腾出更多空间,它会在右侧展开,这意味着我必须将所有内容都移动。当我尝试扩展顶部时会发生同样的事情;底部变大了。我将Canvas的RenderTransformOrigin设置为0,0所以我不太确定发生了什么。任何帮助表示赞赏。 谢谢!

2 个答案:

答案 0 :(得分:0)

默认情况下,Canvas没有宽度或高度,其实际大小取决于您是否明确设置了这些属性,或者将Horizo​​ntalAlignment或VerticalAlignment设置为Stretch

在任何一种情况下,Canvas内部的元素都相对于其左上角对齐,除非您明确设置了Canvas.TopCanvas.LeftCanvas.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);
    }
}

请注意,这些方法不会重新定位画布本身。你将如何做到这一点取决于画布如何'父母正在维持自己的地位。