MesureOverride вернуть больше доступного размера?

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

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

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

2 ответа

Решение

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

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

Где вы видите это ограничение между 0 и availableSize?

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

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

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

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

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

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

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

Другие вопросы по тегам