Как установить DesiredSize.Width элемента UIElement? - PullRequest
2 голосов
/ 30 ноября 2009

Мне нужно рассчитать 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 ]

2 голосов
/ 10 января 2012

Если вы вызываете Measure напрямую, ничего не нужно делать для системы макетов WPF (потому что она кэширует состояние элементов управления и сохраняет его в виде флагов типа MeasureIsValid). Вы должны вызвать InvalidateMeasure() для этого элемента управления (который пометит элемент управления как MeasureIsValid = false) и UpdateLayout(), чтобы принудительно обновить макет.

1 голос
/ 16 декабря 2014

Нельзя изменить напрямую 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, генерируется исключение.

1 голос
/ 16 октября 2012

Ни один из других ответов не работал для меня. Мне нужно было внедрить MeasureOverride в дочерний элемент управления и реализовать желаемое поведение макета.

1 голос
/ 09 августа 2011

Звоните InvalidateArrange(). Система рендеринга вызовет Arrange(Rect) и обновит DesiredSize элемента UIElement с вашим размером.

1 голос
/ 21 августа 2010

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

...