2009-11-30 4 views
2

Мне нужно рассчитать Width каждого UIElement в пользовательской панели. Если цикл над Children:Как установить DesiredSize.Width UIElement?

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?

ответ

0

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

+2

'UIElement' не имеет свойства' Width'. – d7samurai

1

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

1

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

1

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

0

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