【问题标题】:WPF MeasureOverride and ArrangeOverrideWPF MeasureOverride 和 ArrangeOverride
【发布时间】:2014-08-23 00:46:46
【问题描述】:

我的问题更多是理论上的,而不是功能性的。所以我正在寻找的是一个可以用一些文档来支持的答案。

我发现自己需要为 wpf 控件的子项进行一些自定义测量/安排?

  1. 是否可以根据其他尺寸限制而不是作为参数接收的尺寸来测量子级。
  2. 我想要实现的一些伪代码:

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

所有的逻辑都应该存在于 MeasureOverride 中,还是应该只调用 measure 并将接收到的大小作为所有子项的参数,然后在 ArrangeOverride 中执行逻辑? 谢谢!

【问题讨论】:

  • 这取决于你所说的“做逻辑”。如果执行逻辑涉及测量子元素,则应在 MeasureOverride 中执行。在 ArrangeOverride 中,您之前测量过子元素的尺寸并不重要。您可以随意安排。

标签: c# wpf wpf-controls measureoverride arrangeoverride


【解决方案1】:

我认为您可以使用任何尺寸。 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

【讨论】:

    【解决方案2】:

    补充几点:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 2013-11-09
      • 2012-02-01
      • 2011-02-04
      • 2021-10-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多