diff --git a/src/Avalonia.Base/Layout/Layoutable.cs b/src/Avalonia.Base/Layout/Layoutable.cs
index 4a273b0291..ea84dc84bd 100644
--- a/src/Avalonia.Base/Layout/Layoutable.cs
+++ b/src/Avalonia.Base/Layout/Layoutable.cs
@@ -798,6 +798,12 @@ namespace Avalonia.Layout
InvalidateMeasure();
}
+ internal override void OnTemplatedParentControlThemeChanged()
+ {
+ base.OnTemplatedParentControlThemeChanged();
+ InvalidateMeasure();
+ }
+
///
/// Called when the layout manager raises a LayoutUpdated event.
///
diff --git a/src/Avalonia.Base/StyledElement.cs b/src/Avalonia.Base/StyledElement.cs
index 94af8385a8..39aaf55014 100644
--- a/src/Avalonia.Base/StyledElement.cs
+++ b/src/Avalonia.Base/StyledElement.cs
@@ -374,7 +374,7 @@ namespace Avalonia
///
public bool ApplyStyling()
{
- if (_initCount == 0 && (!_stylesApplied || !_themeApplied))
+ if (_initCount == 0 && (!_stylesApplied || !_themeApplied || !_templatedParentThemeApplied))
{
GetValueStore().BeginStyling();
diff --git a/tests/Avalonia.Base.UnitTests/Styling/StyledElementTests_Theming.cs b/tests/Avalonia.Base.UnitTests/Styling/StyledElementTests_Theming.cs
index b5a9b35134..60603937d9 100644
--- a/tests/Avalonia.Base.UnitTests/Styling/StyledElementTests_Theming.cs
+++ b/tests/Avalonia.Base.UnitTests/Styling/StyledElementTests_Theming.cs
@@ -104,7 +104,7 @@ public class StyledElementTests_Theming
target.Theme = null;
Assert.Equal("style", target.Tag);
}
-
+
[Fact]
public void TemplatedParent_Theme_Is_Detached_From_Template_Controls_When_Theme_Property_Cleared()
{
@@ -539,12 +539,42 @@ public class StyledElementTests_Theming
Assert.Same(target.Theme, theme3);
}
+ [Fact]
+ public void TemplatedParent_Theme_Change_Applies_To_Children()
+ {
+ var theme = CreateDerivedTheme();
+ var target = CreateTarget();
+
+ Assert.Null(target.Theme);
+ Assert.Null(target.Template);
+
+ var root = CreateRoot(target, theme.BasedOn);
+
+ Assert.NotNull(target.Theme);
+ Assert.NotNull(target.Template);
+
+ root.Styles.Add(new Style(x => x.OfType().Class("foo"))
+ {
+ Setters = { new Setter(StyledElement.ThemeProperty, theme) }
+ });
+
+ root.LayoutManager.ExecuteLayoutPass();
+
+ var border = Assert.IsType(target.VisualChild);
+ Assert.Equal(Brushes.Red, border.Background);
+
+ target.Classes.Add("foo");
+ root.LayoutManager.ExecuteLayoutPass();
+
+ Assert.Equal(Brushes.Green, border.Background);
+ }
+
private static ThemedControl CreateTarget()
{
return new ThemedControl();
}
- private static TestRoot CreateRoot(Control child)
+ private static TestRoot CreateRoot(Control child, ControlTheme? theme = null)
{
var result = new TestRoot()
{
@@ -552,7 +582,7 @@ public class StyledElementTests_Theming
{
new Style(x => x.OfType())
{
- Setters = { new Setter(StyledElement.ThemeProperty, CreateTheme()) }
+ Setters = { new Setter(StyledElement.ThemeProperty, theme ?? CreateTheme()) }
}
}
};
@@ -580,8 +610,8 @@ public class StyledElementTests_Theming
{
new Style(x => x.Nesting().Template().OfType())
{
- Setters =
- {
+ Setters =
+ {
new Setter(Border.BackgroundProperty, Brushes.Red),
new Setter(Control.TagProperty, tag),
}