我在这里的问题更多是理论上的问题,而不是功能上的问题。因此,我正在寻找的答案可能会得到一些文档的支持。
我发现自己处于需要为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方法中,您可以使用逻辑来理解返回的DesiredSizes。
如果您具有测量逻辑,则它绝对应存在于MeasureOverride方法(或辅助方法)中,而不应存在于ArrangeOverride中。 ArrangeOverride仅用于定位。
我确定您已经选中了此链接,但我仍然会发布链接。http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride%28v=vs.110%29.aspx
一些其他要点:
进行尺寸计算时,请注意不要创建负值。当DesiredSize大于可用大小时,很容易发生这种情况。这样处理:
double remainingWidth = Math.Min(0, availabeSize.Width - DesiredSize.Width);
您可能需要在ArrangeOverride()中重复逻辑形式MeasureOverride()。在ArrangeOverride()中使用在MeasureOverride()中计算的值时要小心,因为可用大小通常不同。