From d8725286aa3ac25423427833dc72bc4d00be3a3c Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 1 Feb 2016 18:21:39 +0100 Subject: [PATCH] Fix layout bug with ScrollViewer. When calling Measure from Arrange, use previous measure constraint if available. --- src/Perspex.Layout/Layoutable.cs | 4 +--- tests/Perspex.Layout.UnitTests/ArrangeTests.cs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Perspex.Layout/Layoutable.cs b/src/Perspex.Layout/Layoutable.cs index aa753c392e..0866b05659 100644 --- a/src/Perspex.Layout/Layoutable.cs +++ b/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) diff --git a/tests/Perspex.Layout.UnitTests/ArrangeTests.cs b/tests/Perspex.Layout.UnitTests/ArrangeTests.cs index 6a7f1c0c66..88e52c1303 100644 --- a/tests/Perspex.Layout.UnitTests/ArrangeTests.cs +++ b/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; }