diff --git a/src/Perspex.Controls/Decorator.cs b/src/Perspex.Controls/Decorator.cs index 36f15f2284..fcf7847d6e 100644 --- a/src/Perspex.Controls/Decorator.cs +++ b/src/Perspex.Controls/Decorator.cs @@ -27,6 +27,7 @@ namespace Perspex.Controls /// static Decorator() { + AffectsMeasure(ChildProperty, PaddingProperty); ChildProperty.Changed.AddClassHandler(x => x.ChildChanged); } diff --git a/src/Perspex.Layout/ILayoutable.cs b/src/Perspex.Layout/ILayoutable.cs index 3b276ef5ac..0d704272f2 100644 --- a/src/Perspex.Layout/ILayoutable.cs +++ b/src/Perspex.Layout/ILayoutable.cs @@ -93,11 +93,7 @@ namespace Perspex.Layout /// Arranges the control and its children. /// /// The control's new bounds. - /// - /// If true, the control will be arranged even if has not changed - /// from the last arrange. - /// - void Arrange(Rect rect, bool force = false); + void Arrange(Rect rect); /// /// Invalidates the measurement of the control and queues a new layout pass. diff --git a/src/Perspex.Layout/Layoutable.cs b/src/Perspex.Layout/Layoutable.cs index 57cba709c1..aa753c392e 100644 --- a/src/Perspex.Layout/Layoutable.cs +++ b/src/Perspex.Layout/Layoutable.cs @@ -352,11 +352,7 @@ namespace Perspex.Layout /// Arranges the control and its children. /// /// The control's new bounds. - /// - /// If true, the control will be arranged even if has not changed - /// from the last arrange. - /// - public void Arrange(Rect rect, bool force = false) + public void Arrange(Rect rect) { if (IsInvalidRect(rect)) { @@ -367,10 +363,10 @@ namespace Perspex.Layout // be re-run. if (!IsMeasureValid) { - return; + Measure(rect.Size); } - if (force || !IsArrangeValid || _previousArrange != rect) + if (!IsArrangeValid || _previousArrange != rect) { _layoutLog.Verbose("Arrange to {Rect} ", rect); diff --git a/tests/Perspex.Layout.UnitTests/ArrangeTests.cs b/tests/Perspex.Layout.UnitTests/ArrangeTests.cs new file mode 100644 index 0000000000..6a7f1c0c66 --- /dev/null +++ b/tests/Perspex.Layout.UnitTests/ArrangeTests.cs @@ -0,0 +1,33 @@ +// Copyright (c) The Perspex Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using Perspex.Controls; +using Xunit; + +namespace Perspex.Layout.UnitTests +{ + public class ArrangeTests + { + [Fact] + public void Arrange_With_IsMeasureValid_False_Calls_Measure() + { + var target = new TestControl(); + + Assert.False(target.IsMeasureValid); + target.Arrange(new Rect(0, 0, 120, 120)); + Assert.True(target.IsMeasureValid); + Assert.Equal(new Size(120, 120), target.MeasureConstraint); + } + + private class TestControl : Border + { + public Size MeasureConstraint { get; private set; } + + protected override Size MeasureOverride(Size constraint) + { + MeasureConstraint = constraint; + return base.MeasureOverride(constraint); + } + } + } +} diff --git a/tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj b/tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj index f5a046630e..c27a2c20d9 100644 --- a/tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj +++ b/tests/Perspex.Layout.UnitTests/Perspex.Layout.UnitTests.csproj @@ -87,6 +87,7 @@ + diff --git a/tests/Perspex.SceneGraph.UnitTests/VisualTree/BoundsTrackerTests.cs b/tests/Perspex.SceneGraph.UnitTests/VisualTree/BoundsTrackerTests.cs index 849fffc609..72386de078 100644 --- a/tests/Perspex.SceneGraph.UnitTests/VisualTree/BoundsTrackerTests.cs +++ b/tests/Perspex.SceneGraph.UnitTests/VisualTree/BoundsTrackerTests.cs @@ -44,9 +44,9 @@ namespace Perspex.SceneGraph.UnitTests.VisualTree tree.Padding = new Thickness(15); tree.Measure(Size.Infinity); - tree.Arrange(new Rect(0, 0, 100, 100), true); + tree.Arrange(new Rect(0, 0, 100, 100)); - Assert.Equal(new Rect(47, 47, 15, 15), results[1].Bounds); + Assert.Equal(new Rect(37, 37, 15, 15), results[1].Bounds); } } }