Il appelle simplement InvalidateArrange()
sur le parent lorsque la propriété est modifiée. Cela conduit WPF à appeler ultérieurement Arrange()
sur le parent. Aucun de ces appels n'a de moyen de l'intercepter (sans utiliser la fonction vraiment des techniques sournoises comme Parcheando le code IL ou l'attachement d'un débogueur au processus).
Cela signifie que les seules façons d'écrire du code géré qui peut détecter le InvalidateArrange()
est de créer un parent personnalisé qui remplace l'élément ArrangeOverride
ou exploiter certains comportements de la méthode Arrange
pour le contrôle en question - par exemple, si le parent est un Panel
vous pourriez ajouter un enfant invisible supplémentaire juste pour recevoir Arrange()
de son parent.
Mise à jour Lorsque vous obtenez le rappel Arrange(), vous ne pouvez pas savoir pourquoi InvalidateArrange() a été appelé sur le parent, mais vous pouvez savoir si la propriété avec l'attribut AffectsParentArrange
a changé ou non en sauvegardant l'ancienne valeur de la propriété à chaque fois qu'elle est modifiée. Arrange
et la compare à la valeur précédemment enregistrée. Ceci peut être étendu à plusieurs propriétés en utilisant une boucle, un dictionnaire et une liste de propriétés ou un appel à GetLocalValueEnumerator()
.