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