Как прослушивать события AffectsParentArrange, когда вы не родитель - PullRequest
2 голосов
/ 11 ноября 2009

Существует атрибут «AffectsParentArrange», который неявно делает недействительным макет родителя, но я хочу присоединить обработчик событий к «событию», инициируемому этим атрибутом.

При изменении дочернего свойства с атрибутом расположение родителя становится недействительным.

У меня есть пользовательский элемент управления (который не является непосредственным родителем), который должен получать событие.

Кто-нибудь знает о событии, которое можно использовать здесь?

Нужно ли предоставлять собственный родительский элемент, который переопределяет метод и запускает событие?

1 Ответ

1 голос
/ 12 ноября 2009

Он просто вызывает InvalidateArrange() для родителя, когда свойство изменяется. Это приводит к тому, что WPF позже вызывает Arrange() для родителя. Ни один из этих вызовов не может перехватить его (без использования действительно хитрых методов, таких как исправление кода IL или присоединение отладчика к процессу).

Это означает, что единственный способ написать управляемый код, который может обнаружить InvalidateArrange(), - это создать собственный родительский элемент, который переопределяет метод ArrangeOverride, или использовать некоторое поведение метода Arrange для конкретного элемента управления в вопрос - например, если родителем является Panel, вы можете добавить дополнительного невидимого потомка, чтобы получать Arrange() звонки от его родителя.

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

...