From bdaf4a2046b776c16135b5ef47864b25d2005e83 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Wed, 13 Dec 2017 15:41:27 -0600 Subject: [PATCH] Fix #1182. --- src/Avalonia.Controls/Control.cs | 14 ++++++++----- src/Avalonia.Controls/Primitives/PopupRoot.cs | 8 +++++++- .../ControlTests_Resources.cs | 16 +++++++++++++++ .../Primitives/PopupRootTests.cs | 20 +++++++++++++++++++ 4 files changed, 52 insertions(+), 6 deletions(-) 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() {