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

时间:2012-01-20 16:41:33

标签: c# wpf .net-4.0

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

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

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

this.ActualHeight

然后当控件初始化时,该值仍为0,因此我什么也得不到。相反,我使用

this.Height

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

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

有一个简单的方法吗?

1 个答案:

答案 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以获得清晰度。我偶尔使用上述方法来测量文本块中的文本,以便在画布上正确定位。