Как установить DesiredSize.Width элемента UIElement?
Мне нужно рассчитать Width
каждого UIElement
в пользовательской панели. Если зацикливание Children
:
foreach (UIElement child in Children) { ... }
Я не могу сделать child.DesiredSize.Width = myCalculatedWidth;
поскольку DesiredSize
а также DesiredSize.Width
только для чтения.
Документы говорят, что это Measure()
обновляет DesiredSize
из UIElement
вот я и попробовал:
Size size = new Size(myCalculatedWidth, Double.PositiveInfinity);
child.Measure(size);
Но child.DesiredSize.Width
без изменений. Как мне установить DesiredSize.Width
?
5 ответов
Если вы позвоните Measure
напрямую ничего не нужно делать для системы разметки WPF (потому что она кэширует состояние элементов управления и сохраняет его в виде флагов, таких как MeasureIsValid
). Вам следует позвонить InvalidateMeasure()
для этого элемента управления (который помечает элемент управления как MeasureIsValid = false)
а также UpdateLayout()
затем заставить макет быть обновленным.
Ни один из других ответов не работал для меня. Что мне нужно было сделать, это реализовать MeasureOverride
в дочернем элементе управления и реализовать желаемое поведение макета там.
Вызов InvalidateArrange()
, Система рендеринга вызовет Arrange(Rect)
и обновить DesiredSize
UIElement с вашим размером.
Нельзя напрямую изменить DesiredSize, так как только UIElement может записывать в DesiredSize, что происходит в UIElement.Measure(). Однако Measure () не вычисляет DesiredWidth, а вместо этого вызывает MeasurementCore. Но даже MeasurementCore не вычисляет DesiredSize напрямую, а вместо этого использует значение retunr для MeasurementOverride. Вот почему вы должны переопределить MeasurementOverride(), чтобы изменить DesiredChange:-)
Это выглядит так:
UIElement.Measure() calls
FrameworkElement.MeasureCore() calls
YourControl.MeasureOverwrite()
возвращаемое значение MeasureOverwrite() становится возвращаемым значением MeasureCore(), которое затем сохраняется в UIElement.DesiredSize.
Обратите внимание, что значение, возвращаемое MeasureOverwrite(), не обязательно совпадает с хранимым в DesiredSize, потому что поле возвращается к возвращенному значению! FrameworkElement.MeasurementCore() также гарантирует, что DesiredSize находится в пределах MinWidth, MaxWidth и Height, соответственно. Если ширина или высота возвращаемого значения isInfinite of isNaN, генерируется исключение.