From d03662a373f0e25efcd71eac84e507f0df0503c7 Mon Sep 17 00:00:00 2001 From: Denis Date: Fri, 18 Nov 2016 07:52:15 +0700 Subject: [PATCH] Not throw exception in last or first position. --- src/Avalonia.Controls/GridSplitter.cs | 57 +++++++++++++++------------ 1 file changed, 31 insertions(+), 26 deletions(-) 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; }