2010-09-07 2 views
10

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

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

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

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

Шон

ответ

12

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

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

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

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

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

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

+0

Это последний бит, «наконец, информирует каждый элемент его выделенного пространства», то есть важную часть. Менеджер виджета не позволяет самим элементам управления размеру, он просто позволяет им делать подсказки. – moswald

+0

Хмм .. Я получаю, как дети могут быть жадными по размеру, который они распределяют, а затем до родителя вывести нужное количество места. Но вы можете добиться этого в однопроходном алгоритме, выполнив меру() каждого дочернего элемента, а затем окончательный макет() для каждого дочернего элемента, который находится под вызовом layout() родителя. Это все равно будет одной рекурсией дерева, но с двумя проходами для каждого набора детей. Я прав, думая, что это достигает той же цели, что и двухпроходный подход, но он менее эффективен? – Sean

+0

С точки зрения бабушки и дедушки родитель - это еще один ребенок, который он хочет измерить() и layout(). ;) – Bubblewrap

Смежные вопросы