Как установить 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() затем заставить макет быть обновленным.

Просто попробуйте с child.Width = myCalculatedWidth,

Ни один из других ответов не работал для меня. Что мне нужно было сделать, это реализовать 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, генерируется исключение.

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