1
0
Эх сурвалжийг харах

Fix measuring to infinity when scrolled to end.

When a virtualized list was scrolled to the bottom and then the list was
measured with a size larger than needed to fit all items (in this case
we use infinity) then the virtualizer tries to go backwards to add items
at the top of the currently visible items by setting `step = -1`;
however it didn't check whether the current index was < 0.

Fixes #589.
Steven Kirk 9 жил өмнө
parent
commit
dd728dae5b

+ 1 - 1
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@@ -252,7 +252,7 @@ namespace Avalonia.Controls.Presenters
                 var index = NextIndex;
                 var step = 1;
 
-                while (!panel.IsFull)
+                while (!panel.IsFull && index >= 0)
                 {
                     if (index >= ItemCount)
                     {

+ 21 - 0
tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

@@ -326,6 +326,27 @@ namespace Avalonia.Controls.UnitTests.Presenters
             Assert.Equal(expected, actual);
         }
 
+        [Fact]
+        public void Measuring_To_Infinity_When_Scrolled_To_End_Should_Not_Throw()
+        {
+            var target = CreateTarget(useAvaloniaList: true);
+
+            target.ApplyTemplate();
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
+
+            ((ILogicalScrollable)target).Offset = new Vector(0, 10);
+
+            // Check for issue #589: this should not throw.
+            target.Measure(Size.Infinity);
+
+            var expected = Enumerable.Range(0, 20).Select(x => $"Item {x}").ToList();
+            var items = (AvaloniaList<string>)target.Items;
+            var actual = target.Panel.Children.Select(x => x.DataContext).ToList();
+
+            Assert.Equal(expected, actual);
+        }
+
         [Fact]
         public void Replacing_Items_Should_Update_Containers()
         {