Skip to content

Commit c21abdf

Browse files
Some initial fixing of the unloaded Adorner issue
Properly handles unloading and loading to mirror with detaching and attaching, but still some other underlying lifecycle work to probably investigate/complete.
1 parent 84f6c44 commit c21abdf

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

components/Adorners/src/Adorner.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)