我正在开发一个具有自定义面板的自定义控件,在自定义面板内我有一个小而简单的MeasureOverride
传递大小的方法double.PositiveInfinity
给它的孩子MeasureOverride
方法。自定义面板应该负责布局,并且应该根据窗口大小使子项变大或变小。
如果您处理过控件,那么您应该知道 wpf 布局系统是如何工作的,并且基本上每个子级都会调用 MeasureOverride,而 MeasureOverride 会调用子级子级的 MeasureOverride 等等。
现在的问题是,当我调整窗口大小时,自定义面板确实收到了再次执行测量的标志,因此MeasureOverride
确实再次被呼叫,但这次是在经过时double.PositiveInfitinty
其子级的大小,子级MeasureOverride
根本不会被调用(但根据 WPF 布局系统的定义应该调用该方法)。为什么会这样?当我打电话时我总是想MeasureOverride
家长认为孩子也会被迫采取这种措施。
显然我错了,所以有人可以解释一下控制/孩子如何知道何时再次测量吗?
顺便说一句,我正在传递的大小double.PositiveInfinity
告诉孩子们,告诉他们根据需要占据尽可能多的空间。
Code:
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);
}
代码很简单。我不明白为什么孩子们没有再次测量。抱歉,如果我在代码中拼写错误。
您的孩子不会再次测量,因为他们不必这样做:由于您不断传递相同的尺寸,WPF 知道没有理由再次测量,因为结果DesiredSize
会是一样的。
话虽这么说,Desiredsize
更新者Measure
仅是您的孩子认为最合适的尺寸。你should覆盖时考虑它ArrangeOverride
,但你没有义务:按照你喜欢的方式安排你的孩子,事实上MeasureOverride
是否为您的孩子打电话应该无关紧要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)