MesureOverride возвращать больше чем availableSize? - PullRequest
2 голосов
/ 07 августа 2009

Я смотрел на FrameworkElement.MesureOverride на MSDN, пытаясь понять механизм, лежащий в основе механизма компоновки. Я наткнулся на эту интересную заметку:

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

Ok. У меня был отражатель рядом, поэтому я посмотрел на MesureCore, который вызывает MesureOverride, и заметил, что из того, что я мог понять, возвращаемое значение MesureOverride всегда ограничено между 0 и availableSize. Так что с этим?

Ответы [ 2 ]

1 голос
/ 07 августа 2009

Дочерний элемент может запросить больше места. Отвечает ли это родительскому элементу, зависит от родительского элемента.

MeasureCore вызывает MeasureOverride только на this. Вы получаете только очень маленькую часть истории. Система размещения начинается с вызова Measure на самом верхнем Panel в дереве элементов, которое вызывает MeasureCore на this. Однако MeasureCore в FrameworkElement вызывает MeasureOverride в нескольких местах.

Где вы видите ограничение от 0 до доступного размера?

Редактировать: Re: «ну, последняя строка MeasureCore ...»

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

  1. У всех элементов управления есть 1 очень распространенный способ запросить больше места, чем им действительно нужно: Margin. Вам нужно написать собственный элемент управления, чтобы запросить еще больше места.
  2. Ограничения, которые вы видите в MeasureCore, насколько я могу судить, имеют отношение к пределам MinWidth / MinHeight и MaxWidth / MaxHeight, если они установлены.

Так что да, элемент управления - как сказано в документации - может запросить больше места, чем необходимо. Кажется, что ни один из элементов управления по умолчанию не делает этого, кроме своих Margin s, и контейнеры, такие как панели, не должны это учитывать. Большинство обстоятельств не используют то, что вы читаете в документации, потому что в большинстве случаев это не имеет смысла ни с точки зрения родителя ребенка.

Если вы создали UserControl, избавились от значений Width и Height в XAML и переопределили MeasureOverride для возврата произвольного Size, затем поместите его экземпляр в Canvas , вы увидите его на Size, который вы вернули.

Эта функция системы макета может быть полезна, если вы создаете пользовательские панели и пользовательские элементы управления или пользовательские элементы управления, но в противном случае, вероятно, нет. Но это там. Документация правильная.

0 голосов
/ 10 января 2012

Если вы вернете Size> availableSize из вашего собственного MeasureOverride метода, FrameworkElement.MeasureCore (вызов вашего метода) запомнит его, но будет установлено DesiredSize = availableSize. Это гарантирует, что дочерний элемент управления будет подходить (например) для ячейки сетки с явно заданной шириной / высотой. НО, потому что FrameworkElement.MeasureCore запоминает ваш "unclipped" DesiredSize, в ArrangeOverride вы должны получить параметр = ваш оригинал DesiredSize. В результате этого ваш элемент управления «виртуально» упорядочивает дочерние элементы в соответствии с исходной DesiredSize, но реализация FrameworkElement обрезает ваш элемент управления для такой родительской ячейки Grid. Конкретный способ отсечения будет зависеть от фактических значений свойств, таких как Horizontal/VerticalAlignment (свойства вашего элемента управления).

...