protected override Size MeasureOverride(Size availableSize)
{
foreach (UIElement child in Children)
{
child.Measure(availableSize);
//you get the desired size after
}
}
因此,为了简洁起见,我将代码缩短了,但我无法理解为什么在某些示例中,他们在获得DesiredHeight DesiredWidth属性之后将availableSize传递给孩子。 Measure实际测量的是什么,为什么我甚至不得不传递任何东西?我已经阅读了msdn并做了一些例子,仍然没有理解,或者我想的太多了。
答案 0 :(得分:1)
控件在WPF中作为树结构(VisualTree)进行布局。 'Panel'是一种控件,可以在其中包含许多子UIElements,换句话说,Panels用作WPF / Silverlight中的LayoutSystem。给定面板的框架是StackPanel,Grid,Canvas等。如果从Panel派生一个类并覆盖MeasureOverride()和ArrangeOverride(),您将能够制作自定义面板。
现在回答这个问题。在自定义面板或控件中,您可以调用child.Measure(availableSize)让所有下一级别的孩子知道'available'size是'孩子'现在拥有的东西。并有机会决定适合的子元素。这就像我告诉我的孩子们,这是我们决定你的尺寸的空间。因此,一旦控件调用Measure(),它就会将其传递给后续的子节点,并且每个控件都会调用自己的measure()直到VisualTree结束,一旦调用结束,您将能够看到孩子想要的所需大小.DesiredSize。既然你得到了所有孩子们想要的尺寸,你就可以计算控制的期望尺寸并在MeasureOverride()函数结束时返回它
布局机制在两个过程中进行测量和排列。一旦您使用可用尺寸测量您的孩子,您可以安排您的孩子,因为在那个设施,您将知道每个孩子需要的孩子大小.DesiredSize
答案 1 :(得分:0)
我从阅读文档的猜测是,AvailableSize用于约束构成目标控件的底层控件的大小。这样,如果可用尺寸很小,或者只能增长到最大尺寸(无论目标区域有多大),它们都会崩溃。
如果你不能适应可用区域,那么在这种情况下也可能出现“错误”,尽管它的用处可能有限。