|
|
@@ -196,6 +196,41 @@ namespace Avalonia.Controls.UnitTests
|
|
|
target.Presenter.Panel.Children.Cast<ListBoxItem>().Select(x => (string)x.Content));
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public void ListBox_After_Scroll_IndexOutOfRangeException_Shouldnt_Be_Thrown()
|
|
|
+ {
|
|
|
+ var items = Enumerable.Range(0, 11).Select(x => $"{x}").ToArray();
|
|
|
+
|
|
|
+ var target = new ListBox
|
|
|
+ {
|
|
|
+ Template = ListBoxTemplate(),
|
|
|
+ Items = items,
|
|
|
+ ItemTemplate = new FuncDataTemplate<string>(x => new TextBlock { Height = 11 })
|
|
|
+ };
|
|
|
+
|
|
|
+ Prepare(target);
|
|
|
+
|
|
|
+ var panel = target.Presenter.Panel as IVirtualizingPanel;
|
|
|
+
|
|
|
+ var listBoxItems = panel.Children.OfType<ListBoxItem>();
|
|
|
+
|
|
|
+ //virtualization should have created exactly 10 items
|
|
|
+ Assert.Equal(10, listBoxItems.Count());
|
|
|
+ Assert.Equal("0", listBoxItems.First().DataContext);
|
|
|
+ Assert.Equal("9", listBoxItems.Last().DataContext);
|
|
|
+
|
|
|
+ //instead pixeloffset > 0 there could be pretty complex sequence for repro
|
|
|
+ //it involves add/remove/scroll to end multiple actions
|
|
|
+ //which i can't find so far :(, but this is the simplest way to add it to unit test
|
|
|
+ panel.PixelOffset = 1;
|
|
|
+
|
|
|
+ //here scroll to end -> IndexOutOfRangeException is thrown
|
|
|
+ target.Scroll.Offset = new Vector(0, 2);
|
|
|
+
|
|
|
+ Assert.True(true);
|
|
|
+ }
|
|
|
+
|
|
|
private FuncControlTemplate ListBoxTemplate()
|
|
|
{
|
|
|
return new FuncControlTemplate<ListBox>(parent =>
|