Browse Source

[Grid] Fix inner size calculation when Row/ColumnDefinition is not set but spacing is set (#19227)

* fix: avoid negative values when calculating combinedRowSpacing/combinedColumnSpacing

* add tests
release/11.3.3
Betta_Fish 6 months ago
committed by Julien Lebosquain
parent
commit
da56ffff99
  1. 8
      src/Avalonia.Controls/Grid.cs
  2. 30
      tests/Avalonia.Controls.UnitTests/GridTests.cs

8
src/Avalonia.Controls/Grid.cs

@ -448,8 +448,8 @@ namespace Avalonia.Controls
MeasureCellsGroup(extData.CellGroup1, false, false);
double rowSpacing = RowSpacing;
double columnSpacing = ColumnSpacing;
double combinedRowSpacing = RowSpacing * (RowDefinitions.Count - 1);
double combinedColumnSpacing = ColumnSpacing * (ColumnDefinitions.Count - 1);
double combinedRowSpacing = RowSpacing * (DefinitionsV.Count - 1);
double combinedColumnSpacing = ColumnSpacing * (DefinitionsU.Count - 1);
Size innerAvailableSize = new Size(constraint.Width - combinedColumnSpacing, constraint.Height - combinedRowSpacing);
{
// after Group1 is measured, only Group3 may have cells belonging to Auto rows.
@ -551,8 +551,8 @@ namespace Avalonia.Controls
Debug.Assert(DefinitionsU.Count > 0 && DefinitionsV.Count > 0);
double rowSpacing = RowSpacing;
double columnSpacing = ColumnSpacing;
double combinedRowSpacing = rowSpacing * (RowDefinitions.Count - 1);
double combinedColumnSpacing = columnSpacing * (ColumnDefinitions.Count - 1);
double combinedRowSpacing = rowSpacing * (DefinitionsV.Count - 1);
double combinedColumnSpacing = columnSpacing * (DefinitionsU.Count - 1);
SetFinalSize(DefinitionsU, arrangeSize.Width - combinedColumnSpacing, true);
SetFinalSize(DefinitionsV, arrangeSize.Height - combinedRowSpacing, false);

30
tests/Avalonia.Controls.UnitTests/GridTests.cs

@ -1900,6 +1900,36 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(grid1.Children[4].Bounds.Width, grid2.Children[0].Bounds.Width);
}
[Fact]
public void Grid_With_ColumnSpacing_And_ColumnDefinitions_Unset()
{
var target = new Grid
{
Height = 300,
Width = 100,
ColumnSpacing = 10,
RowDefinitions = RowDefinitions.Parse("Auto,*"),//Set RowDefinitions to avoid
Children =
{
new Border
{
[Grid.RowProperty] = 0,
Height = 80,
Margin = new Thickness(10),
},
new Border
{
[Grid.RowProperty] = 1,
Margin = new Thickness(20),
},
},
};
target.Measure(new Size(100, 300));
target.Arrange(new Rect(target.DesiredSize));
Assert.Equal(new Rect(10, 10, 80, 80), target.Children[0].Bounds);
Assert.Equal(new Rect(20, 120, 60, 160),target.Children[1].Bounds);
}
private class TestControl : Control
{
public Size MeasureSize { get; set; }

Loading…
Cancel
Save