Browse Source

Merge pull request #10471 from jp2masa/issue-10226

Fixed templated parent theme changed loop
pull/10491/head
Max Katz 3 years ago
committed by GitHub
parent
commit
a0d36df2c3
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      src/Avalonia.Base/Visual.cs
  2. 17
      src/Avalonia.Controls/Primitives/TemplatedControl.cs
  3. 43
      tests/Avalonia.Base.UnitTests/Styling/StyledElementTests_Theming.cs

17
src/Avalonia.Base/Visual.cs

@ -732,6 +732,23 @@ namespace Avalonia
}
}
internal override void OnTemplatedParentControlThemeChanged()
{
base.OnTemplatedParentControlThemeChanged();
var count = VisualChildren.Count;
var templatedParent = TemplatedParent;
for (var i = 0; i < count; ++i)
{
if (VisualChildren[i] is StyledElement child &&
child.TemplatedParent == templatedParent)
{
child.OnTemplatedParentControlThemeChanged();
}
}
}
/// <summary>
/// Computes the <see cref="HasMirrorTransform"/> value according to the
/// <see cref="FlowDirection"/> and <see cref="BypassFlowDirectionPolicies"/>

17
src/Avalonia.Controls/Primitives/TemplatedControl.cs

@ -405,22 +405,5 @@ namespace Avalonia.Controls.Primitives
}
}
}
internal override void OnTemplatedParentControlThemeChanged()
{
base.OnTemplatedParentControlThemeChanged();
var count = VisualChildren.Count;
var templatedParent = TemplatedParent;
for (var i = 0; i < count; ++i)
{
if (VisualChildren[i] is TemplatedControl child &&
child.TemplatedParent == templatedParent)
{
child.OnTemplatedParentControlThemeChanged();
}
}
}
}
}

43
tests/Avalonia.Base.UnitTests/Styling/StyledElementTests_Theming.cs

@ -569,6 +569,46 @@ public class StyledElementTests_Theming
Assert.Equal(Brushes.Green, border.Background);
}
[Fact]
public void TemplatedParent_Theme_Change_Applies_Recursively_To_VisualChildren()
{
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<ThemedControl>().Class("foo"))
{
Setters = { new Setter(StyledElement.ThemeProperty, theme) }
});
root.LayoutManager.ExecuteLayoutPass();
var border = Assert.IsType<Border>(target.VisualChild);
var inner = Assert.IsType<Border>(border.Child);
Assert.Equal(Brushes.Red, border.Background);
Assert.Equal(Brushes.Red, inner.Background);
Assert.Equal(null, inner.BorderBrush);
Assert.Equal(null, inner.BorderBrush);
target.Classes.Add("foo");
root.LayoutManager.ExecuteLayoutPass();
Assert.Equal(Brushes.Green, border.Background);
Assert.Equal(Brushes.Green, inner.Background);
Assert.Equal(Brushes.Cyan, inner.BorderBrush);
Assert.Equal(Brushes.Cyan, inner.BorderBrush);
}
private static ThemedControl CreateTarget()
{
return new ThemedControl();
@ -595,7 +635,8 @@ public class StyledElementTests_Theming
private static ControlTheme CreateTheme(string tag = "theme")
{
var template = new FuncControlTemplate<ThemedControl>((o, n) => new Border());
var template = new FuncControlTemplate<ThemedControl>(
(o, n) => new Border() { Child = new Border() });
return new ControlTheme
{

Loading…
Cancel
Save