@@ -67,10 +67,18 @@ private void OnAdornedElementChanged(UIElement? oldvalue, UIElement? newvalue)
6767 OnSizeChanged ( null , null ! ) ;
6868 OnLayoutUpdated ( null , null ! ) ;
6969
70+ // Track if AdornedElement is loaded
71+ var weakPropertyChangedListenerLoaded = new WeakEventListener < Adorner , object , RoutedEventArgs > ( this )
72+ {
73+ OnEventAction = static ( instance , source , eventArgs ) => instance . OnAdornedElementLoaded ( source , eventArgs ) ,
74+ OnDetachAction = ( weakEventListener ) => newfe . Loaded -= weakEventListener . OnEvent // Use Local References Only
75+ } ;
76+ newfe . Loaded += weakPropertyChangedListenerLoaded . OnEvent ;
77+
7078 // Track if AdornedElement is unloaded
7179 var weakPropertyChangedListenerUnloaded = new WeakEventListener < Adorner , object , RoutedEventArgs > ( this )
7280 {
73- OnEventAction = static ( instance , source , eventArgs ) => instance . OnUnloaded ( source , eventArgs ) ,
81+ OnEventAction = static ( instance , source , eventArgs ) => instance . OnAdornedElementUnloaded ( source , eventArgs ) ,
7482 OnDetachAction = ( weakEventListener ) => newfe . Unloaded -= weakEventListener . OnEvent // Use Local References Only
7583 } ;
7684 newfe . Unloaded += weakPropertyChangedListenerUnloaded . OnEvent ;
@@ -103,13 +111,23 @@ internal void OnLayoutUpdated(object? sender, object e)
103111 }
104112 }
105113
106- private void OnUnloaded ( object source , RoutedEventArgs eventArgs )
114+ private void OnAdornedElementLoaded ( object source , RoutedEventArgs eventArgs )
115+ {
116+ if ( AdornerLayer is null ) return ;
117+
118+ OnAttached ( ) ;
119+ }
120+
121+ private void OnAdornedElementUnloaded ( object source , RoutedEventArgs eventArgs )
107122 {
108123 if ( AdornerLayer is null ) return ;
109124
110125 OnDetaching ( ) ;
111126
112- AdornerLayer . RemoveAdorner ( AdornerLayer , this ) ;
127+ // TODO: Need to evaluate lifecycle a bit more, right now AdornerLayer (via attached property) mostly constrols the lifecycle
128+ // We could use private WeakReference to AdornedElement to re-listen for Loaded event and still remove/re-add via those
129+ // We just like to have the harder reference while we're active to make binding/interaction for Adorner implementer easier in XAML...
130+ //// AdornerLayer.RemoveAdorner(AdornerLayer, this);
113131 }
114132
115133 internal AdornerLayer ? AdornerLayer { get ; set ; }
0 commit comments