Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF画布仅延伸到右侧?_C#_Wpf_Windows_Canvas_Transform - Fatal编程技术网

C# WPF画布仅延伸到右侧?

C# WPF画布仅延伸到右侧?,c#,wpf,windows,canvas,transform,C#,Wpf,Windows,Canvas,Transform,我正在使用C#制作一个WPF应用程序,我正在为它开发更多的UI。我的所有组件(如文本块和其他画布)都位于主画布内,但如果我拖动其左侧以腾出更多空间,它会在右侧展开,这意味着我必须移动所有内容。当我尝试延伸顶部时,也会发生同样的事情;底部越来越大。我将画布的RenderTransferMorigin设置为0,0,因此我不太确定发生了什么。感谢您的帮助。 谢谢 默认情况下,画布没有宽度或高度,其实际大小取决于是否明确设置了这些属性,或者是否将“水平对齐”或“垂直对齐”设置为“拉伸” 在任何一种情况下

我正在使用C#制作一个WPF应用程序,我正在为它开发更多的UI。我的所有组件(如文本块和其他画布)都位于主画布内,但如果我拖动其左侧以腾出更多空间,它会在右侧展开,这意味着我必须移动所有内容。当我尝试延伸顶部时,也会发生同样的事情;底部越来越大。我将画布的RenderTransferMorigin设置为0,0,因此我不太确定发生了什么。感谢您的帮助。
谢谢

默认情况下,画布没有宽度或高度,其实际大小取决于是否明确设置了这些属性,或者是否将“水平对齐”或“垂直对齐”设置为“拉伸”

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

您还可以通过其绝对几何坐标来定位包含几何图形的元素(如
形状
的导数,路径是一个常见的示例)。实际上,这已经是它们的渲染方式

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

常见的方法是向画布添加元素,然后将画布放置在另一个“父”画布中,类似于CorelDraw/Inkscape/Illustrator等向量设计程序中的“分组”

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


当你习惯了将画布视为一个“坐标系”后,你可以也应该想到画布中的画布-画布中的画布-。。。作为对共享同一笛卡尔空间的事物进行分层分组的一种方式,与面板和ContentControls相反,面板和ContentControls彼此嵌套,通常无法共享空间。

默认情况下,画布没有宽度或高度,其实际大小取决于您是否明确设置了这些属性,或者,如果将“水平对齐”或“垂直对齐”设置为“拉伸”

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

您还可以通过其绝对几何坐标来定位包含几何图形的元素(如
形状
的导数,路径是一个常见的示例)。实际上,这已经是它们的渲染方式

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

常见的方法是向画布添加元素,然后将画布放置在另一个“父”画布中,类似于CorelDraw/Inkscape/Illustrator等向量设计程序中的“分组”

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


当你习惯了将画布视为一个“坐标系”后,你可以也应该想到画布中的画布-画布中的画布-。。。作为对共享相同笛卡尔空间的事物进行分层分组的一种方式,与面板和ContentControls相反,面板和ContentControls彼此嵌套,通常无法共享空间。

正如我在评论中所说,画布中的所有控件都是相对于画布的左上点定位的。如果要在画布调整到左侧或顶部时保留它们的“位置”,则需要自己偏移它们。您可以使用一个实用程序方法来实现这一点,只要您想调整画布的大小,就可以调用该实用程序方法:

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

请注意,这些方法不会重新定位画布本身。如何操作取决于画布的父对象如何保持其位置。

正如我在评论中所说,画布中的所有控件都是相对于画布的左上角点定位的。如果要在画布调整到左侧或顶部时保留它们的“位置”,则需要自己偏移它们。您可以使用一个实用程序方法来实现这一点,只要您想调整画布的大小,就可以调用该实用程序方法:

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

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

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