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