Двухпроходный макет пользовательского интерфейса: почему? - PullRequest
10 голосов
/ 07 сентября 2010

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

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

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

Спасибо за чтение этого:)

Sean

1 Ответ

13 голосов
/ 07 сентября 2010

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

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

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

РЕДАКТИРОВАТЬ: Еще несколько объяснений

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...