android - 两次通过 UI 布局 : Why?

标签 android wpf silverlight user-interface layout

我注意到 Android、WPF 和 Silverlight 都遵循二次布局模式。有一个递归的 Measure() 方法被调用来确定元素的大小,可能会调用多次。然后调用递归 Layout/Arrange() 方法,该方法布置子项在其父控件中的确切位置,并且还将设置控件的最终大小。

我的问题:为什么要分成两步,特别是对于某些类型的控件,Measure() 无法在不实际布置子项位置的情况下计算控件的实际大小?是否有某种类型的布局少数情况因此成为可能?

我正在尝试创建自己的 UI 工具包,目前我倾向于使用一次性 Layout() 模式,但我想确定这是否明智。

感谢阅读本文:)

肖恩

最佳答案

两次通过的原因是结构中的任何元素都可以影响其他元素的剩余可用空间。

一些元素希望占据尽可能大的空间,而其他元素则具有固定尺寸。您也可以让元素只设置最大宽度。它创建了一个无法一次性求解的方程式。

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

编辑:更多解释

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

两遍布局模拟并行行为,其中每个元素都会影响整个布局。

关于android - 两次通过 UI 布局 : Why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3657382/

相关文章:

android - RecyclerView 单元格的阴影被剪裁

java - Android Socket 连接比特币节点

android - Gradle:发布ApkProductionRelease到内部测试

wpf - 年历 WPF

WPF 使用 TextFormattingMode ="Display"和连字符错误地测量文本宽度

WPF/银光 : How to disassemble a XAML from a DLL file?

Silverlight MultiScaleImage 不会填充可用空间

android - 应用程序大小明显大于预期?

c# - 以编程方式触发 MouseLeftButtonDown 事件

flash - 使用 Flash 或 Silverlight 进行语音识别