diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index 29094789a4..e165389c79 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/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; } } } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index 1c7a08bdb4..085d420d16 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/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]