我注意到Android,WPF和Silverlight都遵循两遍布局模式。有一个递归的Measure()方法被调用来调整元素的大小,可能是多次。然后调用一个递归的Layout / Arrange()方法,它在父控件中列出子项的确切位置,并且还将设置控件的最终大小。
我的问题:为什么这会被分成两遍,特别是对于某些类型的控件,Measure()无法实际计算控件的实际大小而没有真正布置孩子的位置?是否有某种类型的布局少数情况可以通过这种方式实现?
我正在尝试创建自己的UI工具包,我目前正倾向于一次性布局()模式,但我想确信这是否明智。
感谢您阅读此内容:)
肖恩
答案 0 :(得分:13)
两次通过的原因是结构中的任何元素都可以影响其他元素的剩余可用空间。
某些元素希望占用尽可能大的空间,而其他元素则具有固定的尺寸。您还可以使用仅设置最大宽度的元素。它创造了一个无法一次解决的方程式。
层次结构中的不同面板询问元素在第一遍中需要的大小,然后根据每个面板的性质在它们之间分配空间,最后通知每个元素分配的空间。
编辑:更多解释
单遍布局的主要缺点是您按顺序处理每个元素。第一个元素占用一定的空间,其他元素占用其余部分。为什么这个元素是第一个?尝试使用不同元素顺序的算法,您将得到不同的结果布局。
双向布局模拟并行行为,其中每个元素都会影响整个布局。