Browse Source

Merge pull request #11830 from MrJul/fixes/layout-transform-control-reset

Reset LayoutTransformControl matrix when transform is removed
Julien Lebosquain 2 years ago
parent
commit
1b9aba1cf0

+ 9 - 6
src/Avalonia.Controls/LayoutTransformControl.cs

@@ -215,7 +215,7 @@ namespace Avalonia.Controls
         /// <summary>
         /// Transformation matrix corresponding to _matrixTransform.
         /// </summary>
-        private Matrix _transformation;
+        private Matrix _transformation = Matrix.Identity;
         private IDisposable? _transformChangedEvent;
 
         /// <summary>
@@ -256,13 +256,16 @@ namespace Avalonia.Controls
         /// </remarks>
         private void ApplyLayoutTransform()
         {
-            if (LayoutTransform == null)
-                return;
-
             // Get the transform matrix and apply it
-            _transformation = RoundMatrix(LayoutTransform.Value, DecimalsAfterRound);
+            var matrix = LayoutTransform is null ?
+                Matrix.Identity :
+                RoundMatrix(LayoutTransform.Value, DecimalsAfterRound);
+
+            if (_transformation == matrix)
+                return;
 
-            _matrixTransform.Matrix = _transformation;
+            _transformation = matrix;
+            _matrixTransform.Matrix = matrix;
 
             // New transform means re-layout is necessary
             InvalidateMeasure();

+ 19 - 0
tests/Avalonia.Controls.UnitTests/LayoutTransformControlTests.cs

@@ -169,6 +169,25 @@ namespace Avalonia.Controls.UnitTests
                 new Rect(0, 100, 100, 25));
         }
 
+        [Fact]
+        public void Bounds_On_Transform_Applied_Then_Removed_Are_Correct()
+        {
+            using var app = UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);
+
+            var control = CreateWithChildAndMeasureAndTransform(
+                100,
+                25,
+                new RotateTransform { Angle = 90 });
+
+            Assert.Equal(new Size(25, 100), control.DesiredSize);
+
+            control.LayoutTransform = null;
+            control.Measure(Size.Infinity);
+            control.Arrange(new Rect(control.DesiredSize));
+
+            Assert.Equal(new Size(100, 25), control.DesiredSize);
+        }
+
         [Fact]
         public void Should_Generate_RotateTransform_90_degrees()
         {