Детский элемент может просить больше места. Выполняется ли этот элемент родительским элементом до родительского элемента.
MeasureCore вызывает только MeasureOverride по адресу this
. Вы только получаете очень небольшую часть истории. The Layout System начинается с звонка Measure
на верхнем Panel
в дереве элементов, который вызывает MeasureCore
на this
. Однако MeasureCore
в FrameworkElement
звонит MeasureOverride
в нескольких местах.
Где вы видите его между 0 и доступным размером?
Edit: Re: «хорошо, последняя строка MeasureCore ...»
Как я уже говорил, вы смотрите на небольшую часть всего, что происходит.
- Все элементы управления имеют 1 очень распространенный способ запросить больше места, чем требуется на самом деле:
Margin
. Вам нужно будет написать настраиваемый элемент управления, чтобы запросить еще больше места.
- Ограничения, которые вы видите в
MeasureCore
, от того, что я могу сказать, что нужно сделать с ограничениями в MinWidth
/MinHeight
и MaxWidth
/MaxHeight
, если они установлены.
Так что, контроль - как говорится в документации - может запрашивать больше места, чем необходимо. Ни один из элементов управления по умолчанию, похоже, не делает этого за исключением своих Margin
, и контейнеры, такие как панели, не должны его уважать. Большинство обстоятельств не используют то, что вы читаете в документации, потому что в большинстве случаев это не имеет смысла ни с точки зрения родителя ребенка.
Если вы создали UserControl
, избавившись от Width
и Height
значений в XAML и переопределить MeasureOverride
вернуть произвольные Size
, а затем поместить его экземпляр в Canvas
, вы увидите его отображение на Size
вы вернулись ,
Эта особенность системы компоновки может быть полезна, если вы создаете пользовательские панели и пользовательские элементы управления или пользовательские элементы управления, но в противном случае, вероятно, нет. Но он есть. Документация верна.
ну, последняя строка MesureCore возвращается новый размер (Math.Max (0.0, width), Math.Max (0.0, height)); (это единственный оператор возврата) и немного раньше, что есть пара ifs, например if (width> availableSize.Width) width = availableSize.Width; – subb