Почему ArrangeOverride пересчитывает окончательный размер

Для меня было бы логичным, если бы MeasureOverride вычислял размер FrameworkElement и ArrangeOverride просто размещал дочерние элементы . Но ArrangeOverride упорядочивает не только дочерние элементы. Он также снова вычисляет размер FrameworkElement, чего я не понимаю. Почему MeasureOverride не может рассчитать окончательный размер и все?


person Sam    schedule 04.05.2014    source источник


Ответы (2)


Потому что ваш элемент потенциально не единственный на экране.

Планировка не так проста. WPF должен вычислить фактическое физическое пространство, которое он должен использовать, затем рассчитать, сколько места требуется каждому элементу, масштабировать запрошенное количество, если это возможно, а затем применить его. Кроме того, некоторые элементы могут захотеть внести изменения в зависимости от точного объема выделенного пространства.

Этот мой предыдущий ответ дает вам аналогию.

person slugster    schedule 04.05.2014
comment
Спасибо. Особенно связанный ответ хорош. У вас есть пример, где окончательный размер отличается от того, что возвращает MeasureOverride? - person Sam; 04.05.2014
comment
@Sam Нет, у меня нет примера под рукой, но вы, вероятно, могли бы подделать его (и изучить результат), вернув из MeasureOverride очень большой размер для элемента, который содержится внутри чего-то, что ограничено искусственно маленькой областью ( т.е. он имеет абсолютно размер и положение). - person slugster; 04.05.2014

Если вы реализуете свою собственную панель с собственным алгоритмом компоновки и вызовом ArrangeOverride()

child.Arrange(rect1)

если rect1 отличается от DesiredSize дочернего элемента, система может произвольно принять решение игнорировать размер rect1 и использовать что-то другое. Я видел, как используется DesiredSize, я не уверен, всегда ли это так. Я бы сказал, что это что-то похожее на баг :)

Если rect1 вычисляется в проходе MeasureOverride() панели, то обходным путем для этого поведения является вызов Measure() для дочернего элемента во второй раз, передавая размер rect1, поэтому DesiredSize дочернего элемента пересчитывается перед проходом Arrange() .

person Pragma    schedule 19.03.2017