From abce416e8ee2b4f169e54705a300a2fc37802bd8 Mon Sep 17 00:00:00 2001 From: Tom Edwards <109803929+TomEdwardsEnscape@users.noreply.github.com> Date: Sat, 23 Aug 2025 22:27:22 +0200 Subject: [PATCH] Fixed TransformGroup.Children collection changes not changing TransformGroup.Value (#19525) --- src/Avalonia.Base/Media/TransformGroup.cs | 30 +++++++++++++------ .../Media/TransformOperationsTests.cs | 22 ++++++++++++++ 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Base/Media/TransformGroup.cs b/src/Avalonia.Base/Media/TransformGroup.cs index bce50a7e6b..88c3b921a9 100644 --- a/src/Avalonia.Base/Media/TransformGroup.cs +++ b/src/Avalonia.Base/Media/TransformGroup.cs @@ -20,12 +20,14 @@ namespace Avalonia.Media Justification = "Collection properties shouldn't be set with SetCurrentValue.")] public TransformGroup() { - _childTransformChangedHandler = (_, _) => - { - _lastMatrix = null; - RaiseChanged(); - }; - Children = new Transforms(); + _childTransformChangedHandler = (_, _) => OnTransformInvalidated(); + Children = []; + } + + private void OnTransformInvalidated() + { + _lastMatrix = null; + RaiseChanged(); } /// @@ -79,10 +81,20 @@ namespace Avalonia.Media // Ensure reset behavior is Remove newTransforms.ResetBehavior = ResetBehavior.Remove; _childrenNotificationSubscription = newTransforms.ForEachItem( - (tr) => tr.Changed += _childTransformChangedHandler, - (tr) => tr.Changed -= _childTransformChangedHandler, - () => { }); + added: (tr) => + { + tr.Changed += _childTransformChangedHandler; + OnTransformInvalidated(); + }, + removed: (tr) => + { + tr.Changed -= _childTransformChangedHandler; + OnTransformInvalidated(); + }, + reset: () => { }); } + + OnTransformInvalidated(); } } } diff --git a/tests/Avalonia.Base.UnitTests/Media/TransformOperationsTests.cs b/tests/Avalonia.Base.UnitTests/Media/TransformOperationsTests.cs index 0d84ba1700..beab3f2f9f 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TransformOperationsTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TransformOperationsTests.cs @@ -1,3 +1,4 @@ +using Avalonia.Media; using Avalonia.Media.Transformation; using Avalonia.Utilities; using Xunit; @@ -264,6 +265,27 @@ namespace Avalonia.Base.UnitTests.Media AssertMatrix(interpolated_100.Value, scaleX: 0.5, scaleY: 0.5, translateX: 50, translateY: 50); } + [Fact] + public void TransformGroup_Invalidates_When_Child_Collection_Changes() + { + var group = new TransformGroup(); + var transform = new TranslateTransform(10, 0); + + Assert.Equal(Matrix.Identity, group.Value); + + group.Children.Add(transform); + + Assert.NotEqual(Matrix.Identity, group.Value); + + group.Children.Clear(); + + Assert.Equal(Matrix.Identity, group.Value); + + group.Children = [transform]; + + Assert.NotEqual(Matrix.Identity, group.Value); + } + private static void AssertMatrix(Matrix matrix, double? angle = null, double? scaleX = null, double? scaleY = null, double? translateX = null, double? translateY = null) { Assert.True(Matrix.TryDecomposeTransform(matrix, out var composed));