diff --git a/src/Avalonia.Styling/Styling/Styles.cs b/src/Avalonia.Styling/Styling/Styles.cs
index 1058b863f0..f9cf3910f3 100644
--- a/src/Avalonia.Styling/Styling/Styles.cs
+++ b/src/Avalonia.Styling/Styling/Styles.cs
@@ -233,6 +233,14 @@ namespace Avalonia.Styling
Owner = owner;
_resources?.AddOwner(owner);
+
+ foreach (var child in this)
+ {
+ if (child is IResourceProvider r)
+ {
+ r.AddOwner(owner);
+ }
+ }
}
///
@@ -244,6 +252,14 @@ namespace Avalonia.Styling
{
Owner = null;
_resources?.RemoveOwner(owner);
+
+ foreach (var child in this)
+ {
+ if (child is IResourceProvider r)
+ {
+ r.RemoveOwner(owner);
+ }
+ }
}
}
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs
index 7c017584e4..412b5ec083 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs
@@ -592,6 +592,45 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions
}
}
+ [Fact]
+ public void DynamicResource_Can_Be_Found_In_Nested_Style_File()
+ {
+ var style1Xaml = @"
+
+
+";
+ var style2Xaml = @"
+";
+ using (StyledWindow(
+ ("test:style1.xaml", style1Xaml),
+ ("test:style2.xaml", style2Xaml)))
+ {
+ var xaml = @"
+
+
+
+
+
+";
+
+ var loader = new AvaloniaXamlLoader();
+ var window = (Window)loader.Load(xaml);
+ var border = window.FindControl("border");
+ var borderBrush = (ISolidColorBrush)border.Background;
+
+ Assert.NotNull(borderBrush);
+ Assert.Equal(0xffff0000, borderBrush.Color.ToUint32());
+ }
+ }
+
[Fact]
public void Control_Property_Is_Updated_When_Parent_Is_Changed()
{
diff --git a/tests/Avalonia.Styling.UnitTests/StylesTests.cs b/tests/Avalonia.Styling.UnitTests/StylesTests.cs
index a4afcd34f9..9d3704c91d 100644
--- a/tests/Avalonia.Styling.UnitTests/StylesTests.cs
+++ b/tests/Avalonia.Styling.UnitTests/StylesTests.cs
@@ -40,7 +40,7 @@ namespace Avalonia.Styling.UnitTests
public void Should_Set_Owner_On_Assigned_Resources()
{
var host = new Mock();
- var target = new Style();
+ var target = new Styles();
((IResourceProvider)target).AddOwner(host.Object);
var resources = new Mock();
@@ -63,6 +63,34 @@ namespace Avalonia.Styling.UnitTests
resources.Verify(x => x.AddOwner(host.Object), Times.Once);
}
+ [Fact]
+ public void Should_Set_Owner_On_Child_Style()
+ {
+ var host = new Mock();
+ var target = new Styles();
+ ((IResourceProvider)target).AddOwner(host.Object);
+
+ var style = new Mock();
+ var resourceProvider = style.As();
+ target.Add(style.Object);
+
+ resourceProvider.Verify(x => x.AddOwner(host.Object), Times.Once);
+ }
+
+ [Fact]
+ public void Should_Set_Owner_On_Child_Style_2()
+ {
+ var host = new Mock();
+ var target = new Styles();
+
+ var style = new Mock();
+ var resourceProvider = style.As();
+ target.Add(style.Object);
+
+ host.ResetCalls();
+ ((IResourceProvider)target).AddOwner(host.Object);
+ resourceProvider.Verify(x => x.AddOwner(host.Object), Times.Once);
+ }
[Fact]
public void Finds_Resource_In_Merged_Dictionary()
{