From 6c249f375c02c2861bd8f320a4abfd6736309886 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 26 Nov 2018 02:28:59 +0200 Subject: [PATCH 1/4] add failing test for #2106 scroll to last in listbox not working sometimes --- ...emsPresenterTests_Virtualization_Simple.cs | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index b992453fb0..7187ea16da 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -717,6 +717,45 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(10, target.Panel.Children.Count); } + [Fact] + public void Scroll_To_Last_Should_Work() + { + var target = CreateTarget(itemCount: 11); + var scroller = (TestScroller)target.Parent; + + scroller.Width = scroller.Height = 100; + scroller.LayoutManager.ExecuteInitialLayoutPass(scroller); + + var last = (target.Items as IList)[10]; + + target.ScrollIntoView(last); + + Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset); + Assert.Same(target.Panel.Children[9].DataContext, last); + } + + [Fact] + public void Second_Scroll_To_Last_Should_Work() + { + var target = CreateTarget(itemCount: 11); + var scroller = (TestScroller)target.Parent; + + scroller.Width = scroller.Height = 100; + scroller.LayoutManager.ExecuteInitialLayoutPass(scroller); + + var last = (target.Items as IList)[10]; + + target.ScrollIntoView(last); + + Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset); + Assert.Same(target.Panel.Children[9].DataContext, last); + + target.ScrollIntoView(last); + + Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset); + Assert.Same(target.Panel.Children[9].DataContext, last); + } + public class Vertical { [Fact] @@ -1090,4 +1129,4 @@ namespace Avalonia.Controls.UnitTests.Presenters } } } -} \ No newline at end of file +} From ea274841033a98e656ade0d5c8b5fe7b1b16e6c4 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 26 Nov 2018 02:43:04 +0200 Subject: [PATCH 2/4] fix #2106 scroll to last in listbox not working sometimes --- src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index b177dc50cf..670150dd30 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -517,7 +517,7 @@ namespace Avalonia.Controls.Presenters if (index >= 0 && index < ItemCount) { - if (index < FirstIndex) + if (index <= FirstIndex) { newOffset = index; } @@ -525,7 +525,7 @@ namespace Avalonia.Controls.Presenters { newOffset = index - Math.Ceiling(ViewportValue - 1); } - else if (OffsetValue + ViewportValue >= ItemCount) + else if (OffsetValue + ViewportValue > ItemCount) { newOffset = OffsetValue - 1; } From f090bd0dfb46a240c8e06c559a170cb60d54f9a4 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 26 Nov 2018 03:06:10 +0200 Subject: [PATCH 3/4] remove not needed condition in virtualizer scroll --- src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index 670150dd30..d3ac45a224 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -525,10 +525,6 @@ namespace Avalonia.Controls.Presenters { newOffset = index - Math.Ceiling(ViewportValue - 1); } - else if (OffsetValue + ViewportValue > ItemCount) - { - newOffset = OffsetValue - 1; - } if (newOffset != -1) { From 2c8efb93646246ae84babc673fc3bc03bf3472a8 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Wed, 5 Dec 2018 22:40:26 +0200 Subject: [PATCH 4/4] fix scroll to last in another scenario when listbox is in more dynamic measure ex: in grid with multiple star rows --- src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index d3ac45a224..f72a65ead2 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -542,6 +542,11 @@ namespace Avalonia.Controls.Presenters { layoutManager.ExecuteLayoutPass(); + if (newOffset != -1 && newOffset != OffsetValue) + { + OffsetValue = newOffset; + } + if (panel.ScrollDirection == Orientation.Vertical) { if (container.Bounds.Y < panel.Bounds.Y || container.Bounds.Bottom > panel.Bounds.Bottom)