diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs
index f8db0e2a5b..1af347ab4e 100644
--- a/src/Avalonia.Controls/TopLevel.cs
+++ b/src/Avalonia.Controls/TopLevel.cs
@@ -10,9 +10,11 @@ using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Layout;
using Avalonia.Logging;
+using Avalonia.LogicalTree;
using Avalonia.Platform;
using Avalonia.Rendering;
using Avalonia.Styling;
+using Avalonia.Utilities;
using Avalonia.VisualTree;
using JetBrains.Annotations;
@@ -26,7 +28,13 @@ namespace Avalonia.Controls
/// It handles scheduling layout, styling and rendering as well as
/// tracking the widget's .
///
- public abstract class TopLevel : ContentControl, IInputRoot, ILayoutRoot, IRenderRoot, ICloseable, IStyleRoot
+ public abstract class TopLevel : ContentControl,
+ IInputRoot,
+ ILayoutRoot,
+ IRenderRoot,
+ ICloseable,
+ IStyleRoot,
+ IWeakSubscriber
{
///
/// Defines the property.
@@ -100,7 +108,6 @@ namespace Avalonia.Controls
impl.Resized = HandleResized;
impl.ScalingChanged = HandleScalingChanged;
-
_keyboardNavigationHandler?.SetOwner(this);
_accessKeyHandler?.SetOwner(this);
styler?.ApplyStyles(this);
@@ -116,6 +123,14 @@ namespace Avalonia.Controls
{
_applicationLifecycle.OnExit += OnApplicationExiting;
}
+
+ if (((IStyleHost)this).StylingParent is IResourceProvider applicationResources)
+ {
+ WeakSubscriptionManager.Subscribe(
+ applicationResources,
+ nameof(IResourceProvider.ResourcesChanged),
+ this);
+ }
}
///
@@ -165,6 +180,11 @@ namespace Avalonia.Controls
///
IMouseDevice IInputRoot.MouseDevice => PlatformImpl?.MouseDevice;
+ void IWeakSubscriber.OnEvent(object sender, ResourcesChangedEventArgs e)
+ {
+ ((ILogical)this).NotifyResourcesChanged(e);
+ }
+
///
/// Gets or sets a value indicating whether access keys are shown in the window.
///
diff --git a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs
index da30336be6..da0719893f 100644
--- a/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/TopLevelTests.cs
@@ -219,6 +219,23 @@ namespace Avalonia.Controls.UnitTests
}
}
+ [Fact]
+ public void Adding_Resource_To_Application_Should_Raise_ResourcesChanged()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var impl = new Mock();
+ impl.SetupAllProperties();
+ var target = new TestTopLevel(impl.Object);
+ var raised = false;
+
+ target.ResourcesChanged += (_, __) => raised = true;
+ Application.Current.Resources.Add("foo", "bar");
+
+ Assert.True(raised);
+ }
+ }
+
private FuncControlTemplate CreateTemplate()
{
return new FuncControlTemplate(x =>