我正在尝试在WPF中创建自定义用户控件。我希望能够在以后在另一个窗口中使用该控件时手动设置大小。
作为一个简短的测试,我刚刚制作了一个控件,其中包含一个网格内的画布,完全填满了控件。初始化时,它会在其自身内部绘制一个显示其大小的矩形。然后我把它放在一个窗口上,使它成为我想要的任何尺寸。
但是我现在遇到了问题,好像我画了我绘制的矩形的高度
this.ActualHeight
然后当控件初始化时,该值仍为0,因此我什么也得不到。相反,我使用
this.Height
然后我得到了我在设计时制作的高度,而不是我随后在窗口内制作的尺寸。
高度和宽度似乎是在XAML设计器中设置的,所以我不知道该怎么做。
有一个简单的方法吗?
答案 0 :(得分:1)
我认为您遇到的是WPF performs layout以及Canvas如何不参与布局。
在您的特定情况下,您将Rectangle的宽度设置为Canvas.ActualWidth?除非画布的宽度/高度已经明确设置,否则ActualWidth / Actualheight将为零,因此您无法获得定位Canvas子项的参考点。我要做的是将画布宽度和高度绑定到其父容器(或在代码中设置)以正确传播ActualWidth / ActualHeight。
作为一个兴趣点,请尝试此示例以了解WPF Layout引擎的工作原理。以下代码可以强制FrameworkElement上的高度将Width,Height设置为正常,然后强制对相关元素进行布局(测量,排列传递)。这会导致WPF布局引擎测量/排列元素并将Width,Height传播到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以获得清晰度。我偶尔使用上述方法来测量文本块中的文本,以便在画布上正确定位。