使用double.PositiveInfinity WPF测量控制

时间:2013-02-08 14:54:12

标签: wpf wpf-controls measureoverride

我正在开发一个具有自定义面板的自定义控件,在自定义面板中我有一个简单的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);
}

代码很简单。我不明白为什么孩子们再也没有得到测量。如果我在代码中拼错了一些内容,那就很抱歉。

2 个答案:

答案 0 :(得分:2)

你的孩子不会再次被测量,因为他们没有必要:因为你继续传递相同的大小,WPF知道没有理由再次测量,因为结果DesiredSize将是相同的。

话虽如此,Desiredsize更新的Measure只是您孩子认为最合适的尺寸。在覆盖ArrangeOverride时, 应该将其考虑在内,但您没有义务:只需按您喜欢的方式安排您的孩子,MeasureOverride被调用的事实是你的孩子应该是无关紧要的。

答案 1 :(得分:0)

您是否尝试过调用UIElement.InvalidateMeasure UIElement是您的父母小组?