【问题标题】:WPF Canvas Only Extends to the Right?WPF Canvas 仅向右延伸?
【发布时间】:2017-01-12 02:02:49
【问题描述】:

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

【问题讨论】:

  • 可能发生的情况是您只是增加了画布的宽度/高度。画布相对于其左上角在内部定位所有内容。调整画布大小不会重新定位其中的所有内容。
  • @Abion47 这听起来确实是一个可行的解释。有没有办法可以移动画布相对于所有位置的位置?
  • 为什么你有主画布?对于应用程序的布局,还有更多功能强大的面板,例如 StackPanel、WrapPanel、Grid 等。

标签: c# wpf windows canvas transform


【解决方案1】:

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

在任何一种情况下,Canvas 内的元素都相对于其左上角对齐,除非您明确设置它们的 Canvas.TopCanvas.LeftCanvas.Right 和/或 Canvas.Bottom 属性。

您还可以通过绝对几何坐标来定位包含几何的元素(如Shape 的衍生物,路径是一个常见示例)。实际上这已经是它们的呈现方式了。

关于您在问题中的评论,通常您不会更改相对于画布对齐的位置,因为重新定位画布本身要容易得多(我认为甚至推荐),这样它包含的所有内容也会重新定位。

执行此操作的常用方法是将元素添加到 Canvas,然后将该 Canvas 放置在另一个“父”Canvas 中,类似于 CorelDraw/Inkscape/Illustrator 等矢量设计程序中的“分组”。

另一种方法是使用包含要重新定位的元素的 Canvas 的 RenderTransform 属性。

当您习惯将 Canvas 视为“坐标系”后,您可以并且应该将 Canvas-inside-Canvas-inside-Canvas-... 视为一种对共享相同笛卡尔空间的事物进行分层分组的方式,与 Panels 和 ContentControls 不同,它们相互嵌套,通常不能共享空间。

【讨论】:

    【解决方案2】:

    就像我在评论中所说,画布内的所有控件都相对于画布的左上角定位。如果您希望它们在画布向左或顶部调整大小时保持其“位置”,您需要自己偏移它们。你可以使用一个实用方法来做到这一点,只要你想调整画布的大小,就可以调用它:

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

    请注意,这些方法不会重新定位画布本身。您将如何做到这一点取决于画布的父级如何保持其位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 2012-09-29
      • 2018-12-04
      相关资源
      最近更新 更多