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

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

2 ответа

Решение

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

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

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

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

child.Arrange(rect1)

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

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

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