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 очень распространенный способ запрашивать больше места, чем им нужно на самом деле:
Margin
, Вы должны написать собственный элемент управления, чтобы запросить еще больше места, чем это. - Ограничения, которые вы видите в
MeasureCore
из того, что я могу сказать, связано сMinWidth
/MinHeight
а такжеMaxWidth
/MaxHeight
пределы, если они установлены.
Так что да, элемент управления - как сказано в документации - может запросить больше места, чем необходимо. Кажется, что ни один из элементов управления по умолчанию не делает этого, кроме Margin
s, и контейнеры, такие как панели, не должны уважать это. Большинство обстоятельств не используют то, что вы читаете в документации, потому что в большинстве случаев это не имеет смысла ни с точки зрения родителя ребенка.
Если вы создали UserControl
избавился от Width
а также Height
значения в XAML и переопределить MeasureOverride
вернуть произвольный Size
затем поместите его экземпляр в Canvas
вы бы увидели его на Size
вы вернулись.
Эта функция системы макета может быть полезна, если вы создаете пользовательские панели и пользовательские элементы управления или пользовательские элементы управления, но в противном случае, вероятно, нет. Но это там. Документация верна.
Если вы вернете Size
> availableSize
от вашего собственного MeasureOverride
метод, FrameworkElement.MeasureCore
(вызывая ваш метод) запомнит это, но DesiredSize
будет установлен = availableSize
, Это гарантирует, что дочерний элемент управления будет подходить (например) для ячейки сетки с явно указанными шириной / высотой. Но потому что FrameworkElement.MeasureCore
запоминает твои "незажатые" DesiredSize
, в ArrangeOverride
вы должны получить параметр = ваш оригинал DesiredSize
, В результате этого ваш контроль "виртуально" упорядочивает детей в соответствии с его оригиналом. DesiredSize
, но FrameworkElement
реализация обрезает ваш контроль для такой родительской ячейки сетки. Конкретный способ отсечения будет зависеть от фактических значений свойств, таких как Horizontal/VerticalAlignment
(свойства вашего контроля).