gpt4 book ai didi

c# - InitializeComponent() 上的自定义控件大小

转载 作者:太空宇宙 更新时间:2023-11-03 14:07:28 24 4
gpt4 key购买 nike

我正在尝试在 WPF 中创建自定义用户控件。我希望以后在另一个窗口中使用该控件时能够手动设置大小。

作为一个简短的测试,我刚刚制作了一个包含网格内 Canvas 的控件,它完全填满了控件。初始化时,它会在自身内部绘制一个矩形以显示其大小。然后我将它放在一个窗口上,使其成为我想要的任何大小。

但是我现在遇到了问题,好像我画了矩形的高度

this.ActualHeight

然后当控件初始化时这个值仍然是 0,所以我什么也得不到。相反,如果我使用

this.Height

然后我得到我在设计时制作的高度,而不是我随后在窗口内制作的尺寸。

高度和宽度似乎是在 XAML 设计器中设置的,所以我不知道该怎么做。

有没有简单的方法解决这个问题?

最佳答案

我认为您遇到的是 WPF performs layout,特别是 Canvas 如何不参与布局。

在您的特定情况下,您将 Rectangle 的宽度设置为 Canvas.ActualWidth?除非已明确设置 Canvas 的宽度/高度,否则 ActualWidth/Actualheight 将为零,因此您无法获得用于定位 Canvas 子项的引用点。我要做的是将 Canvas 宽度和高度绑定(bind)到其父容器(或在代码中设置)以正确传播 ActualWidth/ActualHeight。

作为兴趣点,请尝试这个示例以了解 WPF 布局引擎的工作原理。以下代码可以强制 FrameworkElement 上的高度正常设置宽度、高度,然后强制对相关元素进行布局(测量、排列传递)。这会导致 WPF 布局引擎测量/排列元素并将宽度、高度传播到 ActualWidth、ActualHeight。

例如:

// Set the width, height you want
element.Width = 123;
element.Height = 456;

// Force measure/arrange
element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
element.Arrange(new Rect(0, 0, element.DesiredWidth, element.DesiredHeight));

// Subject to sufficient space, the actual width, height will have
// the values propagated from width/height after a measure and arrange call
double width = element.ActualWidth;
double height = element.ActualHeight;

为了清楚起见,另请参阅 this related question。我偶尔使用上述方法来测量文本 block 中的文本,以便在 Canvas 上正确定位。

关于c# - InitializeComponent() 上的自定义控件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8944801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com