Browse Source

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.
pull/612/head
Steven Kirk 10 years ago
parent
commit
dd728dae5b
  1. 2
      src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
  2. 21
      tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

2
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
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()
{

Loading…
Cancel
Save