diff --git a/src/Avalonia.Controls/GridSplitter.cs b/src/Avalonia.Controls/GridSplitter.cs
index 982cb7cbb6..8112b2babd 100644
--- a/src/Avalonia.Controls/GridSplitter.cs
+++ b/src/Avalonia.Controls/GridSplitter.cs
@@ -4,7 +4,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-
using Avalonia.Controls.Primitives;
using Avalonia.Input;
using Avalonia.VisualTree;
@@ -12,16 +11,16 @@ using Avalonia.VisualTree;
namespace Avalonia.Controls
{
///
- /// Represents the control that redistributes space between columns or rows of a Grid control.
+ /// Represents the control that redistributes space between columns or rows of a Grid control.
///
///
- /// Unlike WPF GridSplitter, Avalonia GridSplitter has only one Behavior, GridResizeBehavior.PreviousAndNext.
+ /// Unlike WPF GridSplitter, Avalonia GridSplitter has only one Behavior, GridResizeBehavior.PreviousAndNext.
///
public class GridSplitter : Thumb
{
private List _definitions;
- protected Grid _grid;
+ private Grid _grid;
private DefinitionBase _nextDefinition;
@@ -31,13 +30,13 @@ namespace Avalonia.Controls
private void GetDeltaConstraints(out double min, out double max)
{
- double prevDefinitionLen = GetActualLength(_prevDefinition);
- double prevDefinitionMin = GetMinLength(_prevDefinition);
- double prevDefinitionMax = GetMaxLength(_prevDefinition);
+ var prevDefinitionLen = GetActualLength(_prevDefinition);
+ var prevDefinitionMin = GetMinLength(_prevDefinition);
+ var prevDefinitionMax = GetMaxLength(_prevDefinition);
- double nextDefinitionLen = GetActualLength(_nextDefinition);
- double nextDefinitionMin = GetMinLength(_nextDefinition);
- double nextDefinitionMax = GetMaxLength(_nextDefinition);
+ var nextDefinitionLen = GetActualLength(_nextDefinition);
+ var nextDefinitionMin = GetMinLength(_nextDefinition);
+ var nextDefinitionMax = GetMaxLength(_nextDefinition);
// Determine the minimum and maximum the columns can be resized
min = -Math.Min(prevDefinitionLen - prevDefinitionMin, nextDefinitionMax - nextDefinitionLen);
max = Math.Min(prevDefinitionMax - prevDefinitionLen, nextDefinitionLen - nextDefinitionMin);
@@ -69,26 +68,32 @@ namespace Avalonia.Controls
private double GetActualLength(DefinitionBase definition)
{
+ if (definition == null)
+ return 0;
var columnDefinition = definition as ColumnDefinition;
- return columnDefinition?.ActualWidth ?? ((RowDefinition)definition).ActualHeight;
+ return columnDefinition?.ActualWidth ?? ((RowDefinition) definition).ActualHeight;
}
private double GetMinLength(DefinitionBase definition)
{
+ if (definition == null)
+ return 0;
var columnDefinition = definition as ColumnDefinition;
- return columnDefinition?.MinWidth ?? ((RowDefinition)definition).MinHeight;
+ return columnDefinition?.MinWidth ?? ((RowDefinition) definition).MinHeight;
}
private double GetMaxLength(DefinitionBase definition)
{
+ if (definition == null)
+ return 0;
var columnDefinition = definition as ColumnDefinition;
- return columnDefinition?.MaxWidth ?? ((RowDefinition)definition).MaxHeight;
+ return columnDefinition?.MaxWidth ?? ((RowDefinition) definition).MaxHeight;
}
private bool IsStar(DefinitionBase definition)
{
var columnDefinition = definition as ColumnDefinition;
- return columnDefinition?.Width.IsStar ?? ((RowDefinition)definition).Height.IsStar;
+ return columnDefinition?.Width.IsStar ?? ((RowDefinition) definition).Height.IsStar;
}
private void SetLengthInStars(DefinitionBase definition, double value)
@@ -100,7 +105,7 @@ namespace Avalonia.Controls
}
else
{
- ((RowDefinition)definition).Height = new GridLength(value, GridUnitType.Star);
+ ((RowDefinition) definition).Height = new GridLength(value, GridUnitType.Star);
}
}
@@ -111,28 +116,32 @@ namespace Avalonia.Controls
_orientation = DetectOrientation();
- int pos;
+ int defenitionIndex; //row or col
if (_orientation == Orientation.Vertical)
{
Cursor = new Cursor(StandardCursorType.SizeWestEast);
- pos = GetValue(Grid.ColumnProperty);
_definitions = _grid.ColumnDefinitions.Cast().ToList();
+ defenitionIndex = GetValue(Grid.ColumnProperty);
PseudoClasses.Add(":vertical");
}
else
{
Cursor = new Cursor(StandardCursorType.SizeNorthSouth);
- pos = GetValue(Grid.RowProperty);
+ defenitionIndex = GetValue(Grid.RowProperty);
_definitions = _grid.RowDefinitions.Cast().ToList();
PseudoClasses.Add(":horizontal");
}
- _prevDefinition = _definitions[pos - 1];
- _nextDefinition = _definitions[pos + 1];
+
+ if (defenitionIndex > 0)
+ _prevDefinition = _definitions[defenitionIndex - 1];
+
+ if (defenitionIndex < _definitions.Count - 1)
+ _nextDefinition = _definitions[defenitionIndex + 1];
}
private Orientation DetectOrientation()
{
- if(!_grid.ColumnDefinitions.Any())
+ if (!_grid.ColumnDefinitions.Any())
return Orientation.Horizontal;
if (!_grid.RowDefinitions.Any())
return Orientation.Vertical;
@@ -141,10 +150,6 @@ namespace Avalonia.Controls
var row = GetValue(Grid.RowProperty);
var width = _grid.ColumnDefinitions[col].Width;
var height = _grid.RowDefinitions[row].Height;
- if (!width.IsAuto && !height.IsAuto)
- {
- throw new InvalidOperationException("Whether RowDefenition or ColumnDefenition matched with the GridSplitter should have Auto size");
- }
if (width.IsAuto && !height.IsAuto)
{
return Orientation.Vertical;
@@ -155,7 +160,7 @@ namespace Avalonia.Controls
}
if (_grid.Children.OfType() // Decision based on other controls in the same column
.Where(c => Grid.GetColumn(c) == col)
- .Any(c => c.GetType() != typeof(GridSplitter)))
+ .Any(c => c.GetType() != typeof (GridSplitter)))
{
return Orientation.Horizontal;
}