Browse Source

Use a full item's offset for overflow.

Steven Kirk 9 years ago
parent
commit
81b66596c0

+ 6 - 3
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@@ -48,7 +48,9 @@ namespace Avalonia.Controls.Presenters
 
                 if (delta != 0)
                 {
-                    if ((NextIndex - 1) + delta < ItemCount)
+                    var newLastIndex = (NextIndex - 1) + delta;
+
+                    if (newLastIndex < ItemCount)
                     {
                         if (panel.PixelOffset > 0)
                         {
@@ -63,10 +65,11 @@ namespace Avalonia.Controls.Presenters
                     }
                     else
                     {
-                        // We're moving to a partially obscured item at the end of the list.
+                        // We're moving to a partially obscured item at the end of the list so
+                        // offset the panel by the height of the first item.
                         var firstIndex = ItemCount - panel.Children.Count;
                         RecycleContainersForMove(firstIndex - FirstIndex);
-                        panel.PixelOffset = VirtualizingPanel.PixelOverflow;
+                        panel.PixelOffset = panel.Children[0].Bounds.Height;
                     }
                 }
             }

+ 2 - 2
tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

@@ -142,7 +142,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
             var minIndex = target.ItemContainerGenerator.Containers.Min(x => x.Index);
             Assert.Equal(new Vector(0, 11), ((ILogicalScrollable)target).Offset);
             Assert.Equal(10, minIndex);
-            Assert.Equal(5, ((IVirtualizingPanel)target.Panel).PixelOffset);
+            Assert.Equal(10, ((IVirtualizingPanel)target.Panel).PixelOffset);
 
             ((ILogicalScrollable)target).Offset = new Vector(0, 10);
 
@@ -156,7 +156,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
             minIndex = target.ItemContainerGenerator.Containers.Min(x => x.Index);
             Assert.Equal(new Vector(0, 11), ((ILogicalScrollable)target).Offset);
             Assert.Equal(10, minIndex);
-            Assert.Equal(5, ((IVirtualizingPanel)target.Panel).PixelOffset);
+            Assert.Equal(10, ((IVirtualizingPanel)target.Panel).PixelOffset);
         }
 
         [Fact]