WPF MeasureOverride和ArrangeOverride

问题描述 投票:5回答:2

我在这里的问题更多是理论上的问题,而不是功能上的问题。因此,我正在寻找的答案可能会得到一些文档的支持。

我发现自己处于需要为wpf控件的孩子进行一些自定义尺寸/布置的情况?

  1. 是否可以根据其他大小约束而不是作为参数接收的子约束来测量子项。
  2. 我想要实现的一些伪代码:

    MeasureOverride(size)
     {
       foreach(child in children)
       { 
         if(condition)
         {
           child.measure(size)
         }
         else
         { 
           child.measure(customSize)
           if(...)
           {
             ...
           }
           ...
         }
       }
     }
    

应该将所有逻辑存储在MeasureOverride中,还是应该仅将接收到的大小作为参数的度量调用到所有子代中,然后在ArrangeOverride中执行逻辑?谢谢!

c# wpf wpf-controls measureoverride arrangeoverride
2个回答
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


3
投票

一些其他要点:

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

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

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

  • 确保您为每个孩子调用Measure()和Arrange()。如果不这样做,将不会收到任何错误消息,但是框架将使用可能错误的大小参数来调用它们。
© www.soinside.com 2019 - 2024. All rights reserved.