我正在开发一个具有自定义面板的自定义控件,并且在自定义面板内部我有一个小而简单MeasureOverride
的方法,可以将大小传递double.PositiveInfinity
给它的子MeasureOverride
方法。自定义面板应该负责布局,它应该根据窗口大小使子项变大或变小。
如果您处理过控件,那么您应该知道 wpf 布局系统是如何工作的,并且基本上每个孩子都会调用 MeasureOverride,后者会调用孩子的孩子的 MeasureOverride 等等。
现在的问题是,当我调整窗口大小时,自定义面板确实会收到标志以再次进行测量,因此MeasureOverride
会再次调用它,但这次在将double.PositiveInfitinty
大小传递给其子级时,MeasureOverride
根本不会调用子级(但该方法应根据 WPF 布局系统的定义调用)。为什么呢?我一直认为,当我打电话MeasureOverride
给父母时,孩子们也会被迫采取措施。
显然我错了,所以有人可以解释一下控制/孩子如何知道何时再次测量?
顺便说一句,我将尺寸传递double.PositiveInfinity
给孩子们,告诉他们根据需要占用尽可能多的空间。
代码:
protected override Size MeasureOverride(Size availableSize)
{
double x;
double y;
var children = this.InternalChildren;
for (int i = 0; i < children.Count; i++)
{
UIElement child = children[i];
child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity);
y += child.DesiredSize.Height;
x = Math.Max(x, child.DesiredSize.Width);
}
return new Size(x, y);
}
代码很简单。我不明白为什么孩子们不再被测量。对不起,如果我在代码中拼错了一些东西。