From 3ed14edf128af88bc0af74d0ea123fbd728f0142 Mon Sep 17 00:00:00 2001 From: Michael Mayfield Date: Sun, 24 Jan 2016 14:36:10 +0000 Subject: [PATCH] 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 @@ +