我正在开发一个具有自定义面板的自定义控件,在自定义面板中我有一个简单的MeasureOverride
方法,将double.PositiveInfinity
的大小传递给其子MeasureOverride
方法。自定义面板应该处理布局,并且应该根据窗口大小使子项更大或更小。
如果您已经处理过控件,那么您应该知道wpf布局系统是如何工作的,基本上每个孩子都会调用MeasureOverride,它会调用childs children的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);
}
代码很简单。我不明白为什么孩子们再也没有得到测量。如果我在代码中拼错了一些内容,那就很抱歉。
答案 0 :(得分:2)
你的孩子不会再次被测量,因为他们没有必要:因为你继续传递相同的大小,WPF知道没有理由再次测量,因为结果DesiredSize
将是相同的。
话虽如此,Desiredsize
更新的Measure
只是您孩子认为最合适的尺寸。在覆盖ArrangeOverride
时, 应该将其考虑在内,但您没有义务:只需按您喜欢的方式安排您的孩子,MeasureOverride
被调用的事实是你的孩子应该是无关紧要的。
答案 1 :(得分:0)
您是否尝试过调用UIElement.InvalidateMeasure
UIElement
是您的父母小组?