diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs
index 96955539c1..adeae810c6 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs
@@ -627,6 +627,137 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions
Assert.Equal(0xff506070, brush.Color.ToUint32());
}
+ [Fact]
+ public void Resource_With_DynamicResource_Is_Updated_When_Added_To_Parent()
+ {
+ var xaml = @"
+
+
+
+
+
+
+";
+
+ var loader = new AvaloniaXamlLoader();
+ var userControl = (UserControl)loader.Load(xaml);
+ var border = userControl.FindControl("border");
+
+ DelayedBinding.ApplyBindings(border);
+
+ var brush = (SolidColorBrush)border.Background;
+ Assert.Equal(0u, brush.Color.ToUint32());
+
+ brush.GetObservable(SolidColorBrush.ColorProperty).Subscribe(_ => { });
+
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var window = new Window
+ {
+ Resources =
+ {
+ { "color", Colors.Red }
+ },
+ Content = userControl,
+ };
+
+ window.Show();
+
+ Assert.Equal(Colors.Red, brush.Color);
+ }
+ }
+
+ [Fact]
+ public void MergedDictionary_Resource_With_DynamicResource_Is_Updated_When_Added_To_Parent()
+ {
+ var xaml = @"
+
+
+
+
+
+
+
+
+
+
+
+
+";
+
+ var loader = new AvaloniaXamlLoader();
+ var userControl = (UserControl)loader.Load(xaml);
+ var border = userControl.FindControl("border");
+
+ DelayedBinding.ApplyBindings(border);
+
+ var brush = (SolidColorBrush)border.Background;
+ Assert.Equal(0u, brush.Color.ToUint32());
+
+ brush.GetObservable(SolidColorBrush.ColorProperty).Subscribe(_ => { });
+
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var window = new Window
+ {
+ Resources =
+ {
+ { "color", Colors.Red }
+ },
+ Content = userControl,
+ };
+
+ window.Show();
+
+ Assert.Equal(Colors.Red, brush.Color);
+ }
+ }
+
+ [Fact]
+ public void Style_Resource_With_DynamicResource_Is_Updated_When_Added_To_Parent()
+ {
+ var xaml = @"
+
+
+
+
+
+
+";
+
+ var loader = new AvaloniaXamlLoader();
+ var userControl = (UserControl)loader.Load(xaml);
+ var border = userControl.FindControl("border");
+
+ DelayedBinding.ApplyBindings(border);
+
+ var brush = (SolidColorBrush)border.Background;
+ Assert.Equal(0u, brush.Color.ToUint32());
+
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var window = new Window
+ {
+ Resources =
+ {
+ { "color", Colors.Red }
+ },
+ Content = userControl,
+ };
+
+ window.Show();
+
+ Assert.Equal(Colors.Red, brush.Color);
+ }
+ }
+
private IDisposable StyledWindow(params (string, string)[] assets)
{
var services = TestServices.StyledWindow.With(
diff --git a/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs b/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs
index ae519ed674..3a676529c7 100644
--- a/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs
+++ b/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs
@@ -489,6 +489,53 @@ namespace Avalonia.Styling.UnitTests
called);
}
+ [Fact]
+ public void Changing_Parent_Notifies_Resources_ParentResourcesChanged()
+ {
+ var resources = new Mock();
+ var setResourceParent = resources.As();
+ var target = new TestControl { Resources = resources.Object };
+ var parent = new Decorator { Resources = { { "foo", "bar" } } };
+
+ setResourceParent.ResetCalls();
+ parent.Child = target;
+
+ setResourceParent.Verify(x =>
+ x.ParentResourcesChanged(It.IsAny()),
+ Times.Once);
+ }
+
+ [Fact]
+ public void Changing_Parent_Notifies_Styles_ParentResourcesChanged()
+ {
+ var style = new Mock();
+ var setResourceParent = style.As();
+ var target = new TestControl { Styles = { style.Object } };
+ var parent = new Decorator { Resources = { { "foo", "bar" } } };
+
+ setResourceParent.ResetCalls();
+ parent.Child = target;
+
+ setResourceParent.Verify(x =>
+ x.ParentResourcesChanged(It.IsAny()),
+ Times.Once);
+ }
+
+ [Fact]
+ public void Changing_Resources_Notifies_Styles()
+ {
+ var style = new Mock();
+ var setResourceParent = style.As();
+ var target = new TestControl { Styles = { style.Object } };
+
+ setResourceParent.ResetCalls();
+ target.Resources.Add("foo", "bar");
+
+ setResourceParent.Verify(x =>
+ x.ParentResourcesChanged(It.IsAny()),
+ Times.Once);
+ }
+
private interface IDataContextEvents
{
event EventHandler DataContextBeginUpdate;
diff --git a/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs b/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs
index b8d53b38b2..ee275ca4ba 100644
--- a/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs
+++ b/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs
@@ -205,7 +205,7 @@ namespace Avalonia.Controls.UnitTests
}
[Fact]
- public void Setting_Logical_Parent_Subscribes_To_Parents_ResourceChanged_Event()
+ public void Setting_Logical_Parent_Raises_Child_ResourcesChanged()
{
var parent = new ContentControl();
var child = new StyledElement();
@@ -220,6 +220,23 @@ namespace Avalonia.Controls.UnitTests
Assert.True(raisedOnChild);
}
+ [Fact]
+ public void Setting_Logical_Parent_Raises_Style_ResourcesChanged()
+ {
+ var style = new Style(x => x.OfType