diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs
index 6e1e1a05f1..89721e2e05 100644
--- a/src/Avalonia.Controls/Control.cs
+++ b/src/Avalonia.Controls/Control.cs
@@ -487,11 +487,6 @@ namespace Avalonia.Controls
void ILogical.NotifyResourcesChanged(ResourcesChangedEventArgs e)
{
ResourcesChanged?.Invoke(this, new ResourcesChangedEventArgs());
-
- foreach (var child in LogicalChildren)
- {
- child.NotifyResourcesChanged(e);
- }
}
///
@@ -536,6 +531,15 @@ namespace Avalonia.Controls
}
_parent = (IControl)parent;
+
+ if (old != null)
+ {
+ old.ResourcesChanged -= ThisResourcesChanged;
+ }
+ if (_parent != null)
+ {
+ _parent.ResourcesChanged += ThisResourcesChanged;
+ }
((ILogical)this).NotifyResourcesChanged(new ResourcesChangedEventArgs());
if (_parent is IStyleRoot || _parent?.IsAttachedToLogicalTree == true || this is IStyleRoot)
diff --git a/src/Avalonia.Controls/Primitives/PopupRoot.cs b/src/Avalonia.Controls/Primitives/PopupRoot.cs
index 00d43500c3..b0b0659f63 100644
--- a/src/Avalonia.Controls/Primitives/PopupRoot.cs
+++ b/src/Avalonia.Controls/Primitives/PopupRoot.cs
@@ -8,6 +8,7 @@ using Avalonia.Interactivity;
using Avalonia.Layout;
using Avalonia.Media;
using Avalonia.Platform;
+using Avalonia.Styling;
using Avalonia.VisualTree;
using JetBrains.Annotations;
@@ -16,7 +17,7 @@ namespace Avalonia.Controls.Primitives
///
/// The root window of a .
///
- public class PopupRoot : WindowBase, IInteractive, IHostedVisualTreeRoot, IDisposable
+ public class PopupRoot : WindowBase, IInteractive, IHostedVisualTreeRoot, IDisposable, IResourceNode
{
private IDisposable _presenterSubscription;
@@ -66,6 +67,11 @@ namespace Avalonia.Controls.Primitives
///
IVisual IHostedVisualTreeRoot.Host => Parent;
+ ///
+ /// Gets the styling parent of the popup root.
+ ///
+ IResourceNode IResourceNode.ResourceParent => Parent;
+
///
public void Dispose() => PlatformImpl?.Dispose();
diff --git a/tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs b/tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs
index 6a6cb48001..6acd224fe2 100644
--- a/tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs
+++ b/tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs
@@ -204,6 +204,22 @@ namespace Avalonia.Controls.UnitTests
Assert.True(raised);
}
+ [Fact]
+ public void Setting_Logical_Parent_Subscribes_To_Parents_ResourceChanged_Event()
+ {
+ var parent = new ContentControl();
+ var child = new Border();
+
+ ((ISetLogicalParent)child).SetParent(parent);
+ var raisedOnChild = false;
+
+ child.ResourcesChanged += (_, __) => raisedOnChild = true;
+
+ parent.Resources.Add("foo", "bar");
+
+ Assert.True(raisedOnChild);
+ }
+
private IControlTemplate ContentControlTemplate()
{
return new FuncControlTemplate(x =>
diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs
index b3f91ce937..68a1f1d90f 100644
--- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs
@@ -7,6 +7,7 @@ using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.LogicalTree;
+using Avalonia.Styling;
using Avalonia.UnitTests;
using Avalonia.VisualTree;
using Xunit;
@@ -37,6 +38,25 @@ namespace Avalonia.Controls.UnitTests.Primitives
}
}
+ [Fact]
+ public void PopupRoot_ResourceParent_Is_Popup()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var target = new TemplatedControlWithPopup
+ {
+ PopupContent = new Canvas(),
+ };
+
+ var root = new TestRoot { Child = target };
+
+ target.ApplyTemplate();
+ target.Popup.Open();
+
+ Assert.Equal(target.Popup, ((IResourceNode)target.Popup.PopupRoot).ResourceParent);
+ }
+ }
+
[Fact]
public void Attaching_PopupRoot_To_Parent_Logical_Tree_Raises_DetachedFromLogicalTree_And_AttachedToLogicalTree()
{