【问题标题】:Two-pass UI Layout : Why?两遍 UI 布局:为什么?
【发布时间】:2011-04-09 02:44:16
【问题描述】:

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

我的问题:为什么这会分成两遍,特别是对于某些类型的控件,Measure() 无法计算控件的实际大小而不实际布置子项的位置时?是否有某种类型的布局少数情况可以由此实现?

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

感谢您阅读本文:)

肖恩

【问题讨论】:

    标签: android wpf silverlight user-interface layout


    【解决方案1】:

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

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

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

    编辑:更多解释

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

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

    【讨论】:

    • 最后一点,“最终通知每个元素其分配的空间”,这是重要的部分。小部件管理器不会让控件自己调整大小,它只是让它们做出提示。
    • 嗯.. 我知道孩子们对他们分配的大小是如何贪婪的,然后由父母分配适量的空间。但是,您可以通过对每个孩子进行 measure() 来实现这一点,然后对每个孩子进行最终的 layout() ,所有这些都在父母的 layout() 调用下。这仍然是树的一次递归,但每组孩子有两次遍历。我是否认为这与两次通过方法达到了相同的目的,但效率较低?
    • 从祖父母的角度来看,父母只是它想要测量()和布局()的另一个孩子。 ;)
    • 好的,现在我明白了。谢谢,玛特!
    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多