Browse Source

Propagate ResourcesChanged to template children.

Makes `Changing_Resource_In_Templated_Parent_Should_Affect_Templated_Child` pass again.
pull/3957/head
Steven Kirk 6 years ago
parent
commit
7022c137e7
  1. 15
      src/Avalonia.Controls/Primitives/TemplatedControl.cs
  2. 37
      src/Avalonia.Styling/StyledElement.cs
  3. 24
      tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs

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

@ -287,6 +287,21 @@ namespace Avalonia.Controls.Primitives
return this;
}
protected sealed override void NotifyChildResourcesChanged(ResourcesChangedEventArgs e)
{
var count = VisualChildren.Count;
for (var i = 0; i < count; ++i)
{
if (VisualChildren[i] is ILogical logical)
{
logical.NotifyResourcesChanged(e);
}
}
base.NotifyChildResourcesChanged(e);
}
/// <inheritdoc/>
protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e)
{

37
src/Avalonia.Styling/StyledElement.cs

@ -493,6 +493,28 @@ namespace Avalonia
}
}
/// <summary>
/// Notifies child controls that a change has been made to resources that apply to them.
/// </summary>
/// <param name="e">The event args.</param>
protected virtual void NotifyChildResourcesChanged(ResourcesChangedEventArgs e)
{
if (_logicalChildren is object)
{
var count = _logicalChildren.Count;
if (count > 0)
{
e ??= new ResourcesChangedEventArgs();
for (var i = 0; i < count; ++i)
{
_logicalChildren[i].NotifyResourcesChanged(e);
}
}
}
}
/// <summary>
/// Called when the styled element is added to a rooted logical tree.
/// </summary>
@ -781,19 +803,10 @@ namespace Avalonia
ResourcesChanged(this, e);
}
if (propagate && _logicalChildren is object)
if (propagate)
{
var count = _logicalChildren.Count;
if (count > 0)
{
e ??= new ResourcesChangedEventArgs();
for (var i = 0; i < count; ++i)
{
_logicalChildren[i].NotifyResourcesChanged(e);
}
}
e ??= new ResourcesChangedEventArgs();
NotifyChildResourcesChanged(e);
}
}

24
tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs

@ -166,30 +166,6 @@ namespace Avalonia.Controls.UnitTests
Assert.True(raisedOnChild);
}
[Fact]
public void Adding_Resource_Should_Call_Not_Raise_ResourceChanged_On_Template_Children()
{
Border child;
var target = new ContentControl
{
Content = child = new Border(),
Template = ContentControlTemplate(),
};
var raisedOnTarget = false;
var raisedOnPresenter = false;
target.Measure(Size.Infinity);
target.ResourcesChanged += (_, __) => raisedOnTarget = true;
target.Presenter.ResourcesChanged += (_, __) => raisedOnPresenter = true;
target.Resources.Add("foo", "bar");
Assert.True(raisedOnTarget);
Assert.False(raisedOnPresenter);
}
[Fact]
public void Adding_Resource_To_Styles_Should_Raise_ResourceChanged()
{

Loading…
Cancel
Save