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 @@
+