MeasureOverride не всегда вызывается при изменении свойств детей
Я написал панель, похожую на встроенную StackPanel. Я работаю почти нормально, за исключением небольшой проблемы:
Изменение свойств макета для дочерних элементов не всегда вызывает вызовы MeasureOverride и ArrangeOverride панели. Они всегда вызываются при изменении дочернего свойства Visibility, но не при изменении свойств Width и Height.
Мне еще не удалось воспроизвести это поведение в образце, достаточно маленьком, чтобы его можно было включить в вопрос о Stackru: но, поскольку он хорошо работает в простом образце, который я сделал, я знаю, что должен сделать что-то, чего можно избежать на моей реальной панели,
Итак, мой вопрос: при каких обстоятельствах элемент не делает недействительными измерения его родителей при изменении свойств, связанных с размером?
Я также помечаю этот wpf (я использовал Silverlight) для более широкой аудитории - я подозреваю, что это будет в равной степени относиться к обеим реализациям xaml.
2 ответа
Я понял, в чем была моя ошибка, и при каких условиях панель MeasureOverride больше не вызывается при определенных изменениях свойств, связанных с размером.
Моя панель называлась Измерять детей с точным размером, который должны быть у детей, а не по размеру панели.
Панель не получает свой метод MeasureOverride, вызываемый, когда дети начинают требовать больше места, чем им было сказано, доступно в последнем вызове Measure - что имеет смысл.
Сводка: Параметр для метода Measure, который вы вызываете для дочернего элемента, должен обозначать пространство, которое родительская панель выделяет для всех дочерних элементов, а не только для одного вызванного Measure.
Вы должны убедиться, что вы вызываете базовые методы MeasureOverride.
protected override Size MeasureOverride(Size availableSize)
{
// you must call this
var throwaway = base.MeasureOverride(availableSize);
// your code here
return yourNewSize;
}