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() {