2009-08-04 3 views

ответ

4

В системе макета есть два прохода - измерьте и расположите.

Сначала в мере прохождения каждого ребенка предоставляется предлагаемый размер, и это распространяется по дереву. Это устанавливает свойство каждого ребенка DesiredSize.

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

Также рассмотрят несколько мыслимых случаев угла:

  • Ребенок требует double.Infinity нужного размера: явно не разрешено, вызывает исключение
  • ребенок устанавливает свой HorizontalAlignment «натянуть»: родитель не предлагает бесконечный фактического размер
  • окно устанавливается в SizeToConent, ребенок установлен не установлено «Stretch», никаких других ограничений:
    1. Окно первого предлагает бесконечного размер меры
      • Ребенок требует размера, измеренного его дети (ширина текста, поля, и т.д.) - не бесконечно размера
      • Упорядочить: Окно устанавливает свой размер до минимума системного или определяемого по желанию на ребенка, в зависимости от того, что больше (не может быть бесконечным)
      • ребенок тянется, чтобы соответствовать размеру, определенный в предыдущем шаге
+0

Красиво объяснено. – Stimul8d

+0

Да, спасибо. Для других я читал http://msdn.microsoft.com/en-us/library/ms745058.aspx, а также использовал Refactor для просмотра реального кода WPF. – subb

+0

'Добро пожаловать. Вы имеете в виду * Reflector *, верно? :) –

1

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

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

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

+0

Ok. Я только что сделал еще один тест с текстовым полем. Когда я добавляю текст к нему, окно растягивается для размещения контента. Таким образом, контент является своего рода форсированием измерения. Что произойдет в этом случае? – subb

+0

Что может случиться, так это то, что TextBox разрешено изменять размер, и это окно разрешено. В этом случае цикла больше нет, потому что TextBox имеет некоторые размеры, которые он хочет получить, а именно размер содержимого - больше не связанный с размером окна. Изменение размеров распространяется на визуальное дерево, и окно с удовольствием обязывает, изменяя размер. Это не приводит к изменению размера TextBox. –

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