From 5262d5271a0178b768ac6cea591123dbad75c655 Mon Sep 17 00:00:00 2001 From: mntone Date: Fri, 4 Sep 2020 13:42:37 +0900 Subject: [PATCH] Fix an issue that ThemeHelper isn't enabled after reloading. --- .../MetroRadiance/UI/Controls/ThemeHelper.cs | 80 ++++++++++++++++++- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/source/MetroRadiance/UI/Controls/ThemeHelper.cs b/source/MetroRadiance/UI/Controls/ThemeHelper.cs index 1145d90b..64919c3f 100644 --- a/source/MetroRadiance/UI/Controls/ThemeHelper.cs +++ b/source/MetroRadiance/UI/Controls/ThemeHelper.cs @@ -10,7 +10,10 @@ namespace MetroRadiance.UI.Controls public static class ThemeHelper { private static readonly Dictionary registeredElements = new Dictionary(); - + + private static void AddResources(FrameworkElement element) + => registeredElements[element] = ThemeService.Current.Register(element.Resources); + private static void RemoveResources(FrameworkElement element) { IDisposable disposable; @@ -58,8 +61,7 @@ private static void HasThemeResourcesChangedCallback(DependencyObject d, Depende else if (!oldValue && newValue) { // false -> true - registeredElements[element] = ThemeService.Current.Register(element.Resources); - element.Unloaded += ElementUnloadedCallback; + FrameworkElementLoadedWeakEventManager.AddHandler(element, ElementLoadedCallback); } }; @@ -79,6 +81,13 @@ private static void HasThemeResourcesChangedCallback(DependencyObject d, Depende } } + private static void ElementLoadedCallback(object sender, RoutedEventArgs e) + { + var element = (FrameworkElement)sender; + AddResources(element); + element.Unloaded += ElementUnloadedCallback; + } + private static void ElementUnloadedCallback(object sender, RoutedEventArgs e) { var element = (FrameworkElement)sender; @@ -87,5 +96,70 @@ private static void ElementUnloadedCallback(object sender, RoutedEventArgs e) } #endregion + + private sealed class FrameworkElementLoadedWeakEventManager : WeakEventManager + { + /// + /// Add a handler for the given source's event. + /// + public static void AddHandler(FrameworkElement source, EventHandler handler) + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedAddHandler(source, handler); + } + + /// + /// Remove a handler for the given source's event. + /// + public static void RemoveHandler(FrameworkElement source, EventHandler handler) + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (handler == null) throw new ArgumentNullException(nameof(handler)); + + CurrentManager.ProtectedRemoveHandler(source, handler); + } + + private static FrameworkElementLoadedWeakEventManager CurrentManager + { + get + { + var managerType = typeof(FrameworkElementLoadedWeakEventManager); + var manager = (FrameworkElementLoadedWeakEventManager)GetCurrentManager(managerType); + if (manager == null) + { + manager = new FrameworkElementLoadedWeakEventManager(); + SetCurrentManager(managerType, manager); + } + return manager; + } + } + + private FrameworkElementLoadedWeakEventManager() + { } + + protected override ListenerList NewListenerList() + { + return new ListenerList(); + } + + protected override void StartListening(object source) + { + var element = (FrameworkElement)source; + element.Loaded += this.OnElementLoaded; + } + + protected override void StopListening(object source) + { + var element = (FrameworkElement)source; + element.Loaded -= this.OnElementLoaded; + } + + private void OnElementLoaded(object sender, RoutedEventArgs e) + { + this.DeliverEvent(sender, e); + } + } } }