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

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

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

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

Спасибо за это:)

Шон

Ответ 1

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

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

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

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

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

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