Browse Source

Fix layout bug with ScrollViewer.

When calling Measure from Arrange, use previous measure constraint if
available.
Steven Kirk 9 years ago
parent
commit
d8725286aa
2 changed files with 14 additions and 3 deletions
  1. 1 3
      src/Perspex.Layout/Layoutable.cs
  2. 13 0
      tests/Perspex.Layout.UnitTests/ArrangeTests.cs

+ 1 - 3
src/Perspex.Layout/Layoutable.cs

@@ -359,11 +359,9 @@ namespace Perspex.Layout
                 throw new InvalidOperationException("Invalid Arrange rectangle.");
             }
 
-            // If the measure was invalidated during an arrange pass, wait for the measure pass to
-            // be re-run.
             if (!IsMeasureValid)
             {
-                Measure(rect.Size);
+                Measure(_previousMeasure ?? rect.Size);
             }
 
             if (!IsArrangeValid || _previousArrange != rect)

+ 13 - 0
tests/Perspex.Layout.UnitTests/ArrangeTests.cs

@@ -19,6 +19,19 @@ namespace Perspex.Layout.UnitTests
             Assert.Equal(new Size(120, 120), target.MeasureConstraint);
         }
 
+        [Fact]
+        public void Arrange_With_IsMeasureValid_False_Calls_Measure_With_Previous_Size_If_Available()
+        {
+            var target = new TestControl();
+
+            Assert.False(target.IsMeasureValid);
+            target.Arrange(new Rect(0, 0, 120, 120));
+            target.InvalidateMeasure();
+            target.Arrange(new Rect(0, 0, 100, 100));
+            Assert.True(target.IsMeasureValid);
+            Assert.Equal(new Size(120, 120), target.MeasureConstraint);
+        }
+
         private class TestControl : Border
         {
             public Size MeasureConstraint { get; private set; }