Двухпроходный макет интерфейса: почему?

Я заметил, что Android, WPF и Silverlight следуют шаблону двухпроходного макета. Существует рекурсивный метод Measure (), который вызывается для определения размера элемента, возможно, несколько раз. Затем вызывается рекурсивный метод Layout / Arrange (), который определяет точное положение детей в своем родительском элементе управления и также устанавливает конечный размер элемента управления.

Мой вопрос: почему это разделение на два прохода, особенно когда для некоторых типов элементов управления Measure () не может вычислить фактический размер элемента управления, не устанавливая положения детей? Есть ли какой-то тип макета меньшинства, который стал возможным благодаря этому?

Я пытаюсь создать свой собственный инструментарий пользовательского интерфейса, и в настоящее время я склоняюсь к шаблону Layout () с одним проходом, но я хотел бы убедиться, насколько это разумно или нет.

Спасибо, что прочитали это 🙂

Шон

Причиной двух проходов является то, что любой элемент структуры может влиять на оставшееся свободное пространство других.

Некоторые элементы хотят взять максимально возможное пространство, в то время как другие имеют фиксированные размеры. Вы также можете иметь элементы с максимальной шириной. Он создает уравнение, которое невозможно решить за один проход.

Различные панели в иерархии задают элементам, какой размер им нужен в первом проходе, затем распределяют пространство между ними в соответствии с природой каждой панели и, наконец, информируют каждый элемент его выделенного пространства.

EDIT: Еще несколько объяснений

Основным недостатком однопроходного макета является то, что вы обрабатываете каждый элемент последовательно. Первый элемент занимает определенное пространство, а остальные – остальные. Почему этот элемент первый? Попробуйте свой алгоритм с другим порядком элементов, и у вас будут разные результирующие макеты.

Макет с двумя проходами имитирует параллельное поведение, при котором каждый элемент влияет на весь макет.