WPF MeasureOverride and ArrangeOverride
本文关键字:ArrangeOverride and MeasureOverride WPF | 更新日期: 2023-09-27 18:11:11
我的问题更多是理论性的,而不是功能性的。所以我要找的是一个答案,也许可以用一些文档来支持。
我发现自己处于需要为wpf控件的子控件做一些自定义测量/安排的情况下?
- 是否可以根据其他尺寸约束而不是作为参数接收的尺寸约束来测量子代?
-
我想要实现的一些伪代码:
MeasureOverride(size) { foreach(child in children) { if(condition) { child.measure(size) } else { child.measure(customSize) if(...) { ... } ... } } }
所有的逻辑都应该在MeasureOverride中,还是我应该在所有的子节点上调用测量作为参数的大小,然后在ArrangeOverride中执行逻辑?谢谢!
我认为你可以使用任何大小。MeasureOverride方法的参数指定控件可用的大小。控件可以返回它需要的任何DesiredSize,即使它比AvailableSize大。
子控件也会这样做。在子节点上调用Measure的结果是设置了该子节点的DesiredSize。同样,这可以是任何东西,取决于孩子的测量逻辑。在你的MeasureOverride方法中,你可以使用你的逻辑来理解返回的desiredsize。
如果你有度量逻辑,它肯定应该存在于MeasureOverride方法(或helper方法)中,而不是在ArrangeOverride中。ArrangeOverride仅用于定位。
我相信你已经检查过这个,但我仍然会发布链接。http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride%28v=vs.110%29.aspx
附加说明:
- 您的伪代码缺失,您需要返回在MeasureOverride()中使用的总大小。您需要将子控件的DesiredSize组合为控件打算使用的总大小。您不能返回availableSize,它可能是无限的。
- 当你在MeasureOverride()中接收无穷大的尺寸时,你不能返回无穷大,但是0是可以的。在这种情况下,ArrangeOverride()将接收所有可用的大小。
-
在进行大小计算时,请注意不要创建负值。当DesiredSize大于可用大小时,很容易发生这种情况。像这样处理:
double remainingWidth = Math.Min(0, availabeSize.Width - DesiredSize.Width);
-
你可能需要在ArrangeOverride()中重复MeasureOverride()的逻辑形式。当使用在MeasureOverride()中计算的值时要小心,因为可用的大小经常是不同的。
- 确保为每个孩子调用Measure()和Arrange()。如果你不这样做,你将不会得到任何错误消息,但框架将调用他们可能错误的大小参数。