双通道UI布局:为什么?

我注意到Android,WPF和Silverlight都遵循两遍布局模式。 有一个recursion的Measure()方法被调用来调整元素的大小,可能多次。 然后调用一个recursion的Layout / Arrange()方法,该方法将子控件在父控件中的确切位置进行布局,并设置控件的最终大小。

我的问题是:为什么这会分成两个阶段,特别是对于某些types的控件,Measure()不能真正计算出控件的实际大小,而实际上并没有布置子项的位置? 是否有某种types的布局less数人的情况下,由此可能?

我正在尝试创build自己的UI工具包,而且我正在倾向于一个一次通过Layout()模式,但我想确信这是否明智。

感谢您阅读此:)

肖恩

Solutions Collecting From Web of "双通道UI布局:为什么?"

这两个过程的原因是,结构中的任何元素都可以影响其余的剩余空间。

有些元素希望占用尽可能大的空间,而其他元素则有固定的尺寸。 您也可以使用仅设置最大宽度的元素。 它创build了一个无法一次解决的方程。

层次结构中的不同面板会询问元素在第一遍中需要的大小,然后根据每个面板的性质分配它们之间的空间,最后通知每个元素其分配的空间。

编辑:一些更多的解释

单遍布局的主要缺点是您正在按顺序处理每个元素。 第一个元素占用一定的空间,其余的则占据一定的空间。 为什么这个元素是第一个? 用不同的元素顺序尝试你的algorithm,你将得到不同的结果布局。

两遍布局模拟了每个元素影响整个布局的并行行为。