2

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

代码很简单。我不明白为什么孩子们不再被测量。对不起,如果我在代码中拼错了一些东西。

4

2 回答 2

2

您的孩子不会再次被测量,因为他们不必这样做:因为您一直传递相同的大小,WPF 知道没有理由再次测量,因为结果DesiredSize将是相同的。

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

于 2013-02-08T15:41:32.387 回答
0

您是否尝试过调用您的父面板在UIElement.InvalidateMeasure哪里?UIElement

于 2013-02-08T15:21:27.763 回答