Он просто вызывает InvalidateArrange()
для родителя, когда свойство изменяется. Это приводит к тому, что WPF позже вызывает Arrange()
для родителя. Ни один из этих вызовов не может перехватить его (без использования действительно хитрых методов, таких как исправление кода IL или присоединение отладчика к процессу).
Это означает, что единственный способ написать управляемый код, который может обнаружить InvalidateArrange()
, - это создать собственный родительский элемент, который переопределяет метод ArrangeOverride
, или использовать некоторое поведение метода Arrange
для конкретного элемента управления в вопрос - например, если родителем является Panel
, вы можете добавить дополнительного невидимого потомка, чтобы получать Arrange()
звонки от его родителя.
Обновление Когда вы получаете обратный вызов Arrange (), вы не можете определить, почему InvalidateArrange () был вызван для родителя, но вы можете определить, изменилось ли свойство с флагом AffectsParentArrange
или нет, сохранив старое значение свойства в каждом вызове Arrange
и сравнение его с ранее сохраненным значением. Это может быть расширено до нескольких свойств с помощью цикла, словаря и либо списка свойств, либо вызова GetLocalValueEnumerator()
.