Для меня было бы логичным, если бы MeasureOverride вычислял размер FrameworkElement и ArrangeOverride просто размещал дочерние элементы . Но ArrangeOverride упорядочивает не только дочерние элементы. Он также снова вычисляет размер FrameworkElement, чего я не понимаю. Почему MeasureOverride не может рассчитать окончательный размер и все?
Почему ArrangeOverride пересчитывает окончательный размер
Ответы (2)
Потому что ваш элемент потенциально не единственный на экране.
Планировка не так проста. WPF должен вычислить фактическое физическое пространство, которое он должен использовать, затем рассчитать, сколько места требуется каждому элементу, масштабировать запрошенное количество, если это возможно, а затем применить его. Кроме того, некоторые элементы могут захотеть внести изменения в зависимости от точного объема выделенного пространства.
Этот мой предыдущий ответ дает вам аналогию.
Если вы реализуете свою собственную панель с собственным алгоритмом компоновки и вызовом ArrangeOverride()
child.Arrange(rect1)
если rect1 отличается от DesiredSize дочернего элемента, система может произвольно принять решение игнорировать размер rect1 и использовать что-то другое. Я видел, как используется DesiredSize, я не уверен, всегда ли это так. Я бы сказал, что это что-то похожее на баг :)
Если rect1 вычисляется в проходе MeasureOverride() панели, то обходным путем для этого поведения является вызов Measure() для дочернего элемента во второй раз, передавая размер rect1, поэтому DesiredSize дочернего элемента пересчитывается перед проходом Arrange() .