From 3ed14edf128af88bc0af74d0ea123fbd728f0142 Mon Sep 17 00:00:00 2001 From: Michael Mayfield Date: Sun, 24 Jan 2016 14:36:10 +0000 Subject: [PATCH 1/2] Fix Grid sizing being broken when using Grid.ColumnSpan. Caused by CreateMatrices not clearing the existing matrices. This means previous measures alter the results of a measure. --- src/Perspex.Controls/Grid.cs | 5 ++ tests/Perspex.Controls.UnitTests/GridTests.cs | 68 +++++++++++++++++++ .../Perspex.Controls.UnitTests.csproj | 1 + 3 files changed, 74 insertions(+) create mode 100644 tests/Perspex.Controls.UnitTests/GridTests.cs diff --git a/src/Perspex.Controls/Grid.cs b/src/Perspex.Controls/Grid.cs index 1cb80e4221..c2da194441 100644 --- a/src/Perspex.Controls/Grid.cs +++ b/src/Perspex.Controls/Grid.cs @@ -587,6 +587,11 @@ namespace Perspex.Controls _rowMatrix = new Segment[rowCount, rowCount]; _colMatrix = new Segment[colCount, colCount]; } + else + { + Array.Clear(_rowMatrix, 0, _rowMatrix.Length); + Array.Clear(_colMatrix, 0, _colMatrix.Length); + } } private void ExpandStarCols(Size availableSize) diff --git a/tests/Perspex.Controls.UnitTests/GridTests.cs b/tests/Perspex.Controls.UnitTests/GridTests.cs new file mode 100644 index 0000000000..af38da5e3e --- /dev/null +++ b/tests/Perspex.Controls.UnitTests/GridTests.cs @@ -0,0 +1,68 @@ +// 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.Controls.UnitTests +{ + public class GridTests + { + [Fact] + public void Calculates_Colspan_Correctly() + { + var target = new Grid + { + ColumnDefinitions = new ColumnDefinitions + { + new ColumnDefinition(GridLength.Auto), + new ColumnDefinition(new GridLength(4, GridUnitType.Pixel)), + new ColumnDefinition(GridLength.Auto), + }, + RowDefinitions = new RowDefinitions + { + new RowDefinition(GridLength.Auto), + new RowDefinition(GridLength.Auto), + }, + Children = new Controls + { + new Border + { + Width = 100, + Height = 25, + [Grid.ColumnSpanProperty] = 3, + }, + new Border + { + Width = 150, + Height = 25, + [Grid.RowProperty] = 1, + }, + new Border + { + Width = 50, + Height = 25, + [Grid.RowProperty] = 1, + [Grid.ColumnProperty] = 2, + } + }, + }; + + target.Measure(Size.Infinity); + + // Issue #25 only appears after a second measure + target.InvalidateMeasure(); + target.Measure(Size.Infinity); + + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(new Size(204, 50), target.Bounds.Size); + Assert.Equal(150d, target.ColumnDefinitions[0].ActualWidth); + Assert.Equal(4d, target.ColumnDefinitions[1].ActualWidth); + Assert.Equal(50d, target.ColumnDefinitions[2].ActualWidth); + Assert.Equal(new Rect(52, 0, 100, 25), target.Children[0].Bounds); + Assert.Equal(new Rect(0, 25, 150, 25), target.Children[1].Bounds); + Assert.Equal(new Rect(154, 25, 50, 25), target.Children[2].Bounds); + } + } +} diff --git a/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj b/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj index c2535d887e..c4283ef06e 100644 --- a/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj +++ b/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj @@ -84,6 +84,7 @@ + From 928e159aba7a12025244a2a12c7960483931c9d6 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sun, 24 Jan 2016 16:59:01 +0100 Subject: [PATCH 2/2] Added DesiredSize as a readonly PP. --- src/Perspex.Layout/Layoutable.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Perspex.Layout/Layoutable.cs b/src/Perspex.Layout/Layoutable.cs index 9930c24614..c804f1a3c7 100644 --- a/src/Perspex.Layout/Layoutable.cs +++ b/src/Perspex.Layout/Layoutable.cs @@ -66,6 +66,12 @@ namespace Perspex.Layout /// public class Layoutable : Visual, ILayoutable { + /// + /// Defines the property. + /// + public static readonly PerspexProperty DesiredSizeProperty = + PerspexProperty.RegisterDirect(nameof(DesiredSize), o => o.DesiredSize); + /// /// Defines the property. /// @@ -249,7 +255,7 @@ namespace Perspex.Layout public Size DesiredSize { get; - set; + private set; } ///