فهرست منبع

[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
Betta_Fish 2 ماه پیش
والد
کامیت
016f32d90b
2فایلهای تغییر یافته به همراه34 افزوده شده و 4 حذف شده
  1. 4 4
      src/Avalonia.Controls/Grid.cs
  2. 30 0
      tests/Avalonia.Controls.UnitTests/GridTests.cs

+ 4 - 4
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 - 0
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; }