diff --git a/src/Perspex.Controls/GridSplitter.cs b/src/Perspex.Controls/GridSplitter.cs index b6a16a898d..39e235cda3 100644 --- a/src/Perspex.Controls/GridSplitter.cs +++ b/src/Perspex.Controls/GridSplitter.cs @@ -106,12 +106,14 @@ namespace Perspex.Controls { return; } - if (_grid.ColumnDefinitions[GetValue(Grid.ColumnProperty)].Width.IsAuto) + var column = GetValue(Grid.ColumnProperty); + if (column < _grid.ColumnDefinitions.Count && _grid.ColumnDefinitions[column].Width.IsAuto) { Orientation = Perspex.Controls.Orientation.Vertical; return; } - if (_grid.RowDefinitions[GetValue(Grid.RowProperty)].Height.IsAuto) + var row = GetValue(Grid.RowProperty); + if (row < _grid.RowDefinitions.Count && _grid.RowDefinitions[row].Height.IsAuto) { Orientation = Perspex.Controls.Orientation.Horizontal; return; diff --git a/tests/Perspex.Controls.UnitTests/GridSplitterTests.cs b/tests/Perspex.Controls.UnitTests/GridSplitterTests.cs new file mode 100644 index 0000000000..2fd2c71034 --- /dev/null +++ b/tests/Perspex.Controls.UnitTests/GridSplitterTests.cs @@ -0,0 +1,106 @@ +using Moq; + +using Perspex.Controls.Primitives; +using Perspex.Input; +using Perspex.Platform; + +using Xunit; + +namespace Perspex.Controls.UnitTests +{ + public class GridSplitterTests + { + [Fact] + public void Vertical_Stays_Within_Constrains() + { + var cursorFactoryImpl = new Mock(); + PerspexLocator.CurrentMutable.Bind().ToConstant(cursorFactoryImpl.Object); + + var control1 = new Border { [Grid.ColumnProperty] = 0 }; + var splitter = new GridSplitter { [Grid.ColumnProperty] = 1}; + var control2 = new Border { [Grid.ColumnProperty] = 2 }; + + var columnDefenitions = new ColumnDefinitions() + { + new ColumnDefinition(1, GridUnitType.Star) {MinWidth = 10, MaxWidth = 190}, + new ColumnDefinition(GridLength.Auto), + new ColumnDefinition(1, GridUnitType.Star) {MinWidth = 80, MaxWidth = 120}, + }; + var grid = new Grid() + { + ColumnDefinitions = columnDefenitions, + Children = new Controls() + { + control1, splitter, control2 + } + }; + + var root = new TestRoot { Child = grid }; + Assert.Equal(splitter.Orientation, Orientation.Vertical); + + root.Measure(new Size(200, 100)); + root.Arrange(new Rect(0, 0, 200, 100)); + + splitter.RaiseEvent(new VectorEventArgs + { + RoutedEvent = Thumb.DragDeltaEvent, + Vector = new Vector(-100,0) + }); + Assert.Equal(columnDefenitions[0].Width, new GridLength(80,GridUnitType.Star)); + Assert.Equal(columnDefenitions[2].Width, new GridLength(120,GridUnitType.Star)); + splitter.RaiseEvent(new VectorEventArgs + { + RoutedEvent = Thumb.DragDeltaEvent, + Vector = new Vector(100, 0) + }); + Assert.Equal(columnDefenitions[0].Width, new GridLength(120, GridUnitType.Star)); + Assert.Equal(columnDefenitions[2].Width, new GridLength(80, GridUnitType.Star)); + } + + [Fact] + public void Horizontal_Stays_Within_Constrains() + { + var cursorFactoryImpl = new Mock(); + PerspexLocator.CurrentMutable.Bind().ToConstant(cursorFactoryImpl.Object); + + var control1 = new Border { [Grid.RowProperty] = 0 }; + var splitter = new GridSplitter { [Grid.RowProperty] = 1 }; + var control2 = new Border { [Grid.RowProperty] = 2 }; + + var rowDefenitions = new RowDefinitions() + { + new RowDefinition(1, GridUnitType.Star) {MinHeight = 70, MaxHeight = 110}, + new RowDefinition(GridLength.Auto), + new RowDefinition(1, GridUnitType.Star) { MinHeight = 10, MaxHeight = 140}, + }; + var grid = new Grid() + { + RowDefinitions = rowDefenitions, + Children = new Controls() + { + control1, splitter, control2 + } + }; + + var root = new TestRoot { Child = grid }; + Assert.Equal(splitter.Orientation, Orientation.Horizontal); + root.Measure(new Size(100, 200)); + root.Arrange(new Rect(0, 0, 100, 200)); + + splitter.RaiseEvent(new VectorEventArgs + { + RoutedEvent = Thumb.DragDeltaEvent, + Vector = new Vector(0, -100) + }); + Assert.Equal(rowDefenitions[0].Height, new GridLength(70, GridUnitType.Star)); + Assert.Equal(rowDefenitions[2].Height, new GridLength(130, GridUnitType.Star)); + splitter.RaiseEvent(new VectorEventArgs + { + RoutedEvent = Thumb.DragDeltaEvent, + Vector = new Vector(0, 100) + }); + Assert.Equal(rowDefenitions[0].Height, new GridLength(110, GridUnitType.Star)); + Assert.Equal(rowDefenitions[2].Height, new GridLength(90, GridUnitType.Star)); + } + } +} \ No newline at end of file diff --git a/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj b/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj index 745556a791..8f6cca978e 100644 --- a/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj +++ b/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj @@ -81,6 +81,10 @@ + + + +