WPF MeasureOverride和ArrangeOverride

时间:2014-07-02 09:29:50

标签: c# wpf wpf-controls measureoverride arrangeoverride

我的问题更多的是理论问题,而不是功能问题。所以我正在寻找的答案可以通过一些文档进行备份。

我发现自己处于需要为wpf控制的孩子做一些自定义测量/安排的情况?

  1. 可以根据其他大小限制来测量子项,而不是作为参数接收的子项。
  2. 我试图实现的一些假代码:

    MeasureOverride(size)
     {
       foreach(child in children)
       { 
         if(condition)
         {
           child.measure(size)
         }
         else
         { 
           child.measure(customSize)
           if(...)
           {
             ...
           }
           ...
         }
       }
     }
    
  3. 如果所有逻辑都存在于MeasureOverride中,或者我应该只调用在所有子节点上作为参数接收的大小的measure,然后在ArrangeOverride中执行逻辑? 谢谢!

2 个答案:

答案 0 :(得分:4)

我认为你可以使用任何尺寸。 MeasureOverride方法的参数指定控件的可用大小。控件可以返回它需要的任何DesiredSize,即使它比AvailableSize大。

子控件也会这样做。在子项上调用Measure的结果是该子项的DesiredSize已设置。这可以是任何东西,取决于孩子的测量逻辑。在MeasureOverride方法中,您可以使用逻辑来理解返回的DesiredSizes。

如果你有测量逻辑,它肯定应该存在于MeasureOverride方法(或辅助方法)中而不是在ArrangeOverride中。 ArrangeOverride仅用于定位。

我确定你已经检查了这个,但我仍然会发布链接。 http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride%28v=vs.110%29.aspx

答案 1 :(得分:2)

其他一些要点:

  • 您缺少伪代码,需要返回MeasureOverride()中使用的总大小。您需要将孩子的DesiredSize组合成您的控件打算使用的总大小。你不能返回availableSize,这可能是无限的。
  • 当您在MeasureOverride()中收到无限大小时,您无法返回无限,但0可以。在这种情况下,ArrangeOverride()将收到所有可用的大小。
  • 进行尺寸计算时,请注意不要创建负值。当DesiredSize大于可用大小时,很容易发生这种情况。像这样处理:

    double remainingWidth = Math.Min(0,availabilitybeSize.Width - DesiredSize.Width);

  • 您可能需要在ArrangeOverride()中重复逻辑形式MeasureOverride()。使用在ArrangeOverride()内的MeasureOverride()中计算的值时要小心,因为可用的大小通常不同。

  • 确保为每个孩子调用Measure()和Arrange()。如果不这样做,您将不会收到任何错误消息,但框架将使用可能错误的大小参数调用它们。