Browse Source

Use a full item's offset for overflow.

pull/545/head
Steven Kirk 10 years ago
parent
commit
81b66596c0
  1. 9
      src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
  2. 4
      tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

9
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;
}
}
}

4
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]

Loading…
Cancel
Save