diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index 0722802962..724c155efd 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -291,7 +291,7 @@ namespace Avalonia.Controls if (container == null && SelectedIndex != -1) { - ScrollIntoView(Selection.SelectedItem); + ScrollIntoView(Selection.SelectedIndex); container = ItemContainerGenerator.ContainerFromIndex(selectedIndex); } diff --git a/src/Avalonia.Controls/Presenters/IItemsPresenter.cs b/src/Avalonia.Controls/Presenters/IItemsPresenter.cs index c4acf1ebef..a487ee390b 100644 --- a/src/Avalonia.Controls/Presenters/IItemsPresenter.cs +++ b/src/Avalonia.Controls/Presenters/IItemsPresenter.cs @@ -14,6 +14,6 @@ namespace Avalonia.Controls.Presenters void ItemsChanged(NotifyCollectionChangedEventArgs e); - void ScrollIntoView(object item); + void ScrollIntoView(int index); } } diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizer.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizer.cs index ae52e733b7..a25855ae49 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizer.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizer.cs @@ -257,8 +257,8 @@ namespace Avalonia.Controls.Presenters /// /// Scrolls the specified item into view. /// - /// The item. - public virtual void ScrollIntoView(object item) + /// The index of the item. + public virtual void ScrollIntoView(int index) { } diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs index 56f64779f6..f0b7fb41ff 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs @@ -67,18 +67,13 @@ namespace Avalonia.Controls.Presenters /// /// Scrolls the specified item into view. /// - /// The item. - public override void ScrollIntoView(object item) + /// The index of the item. + public override void ScrollIntoView(int index) { - if (Items != null) + if (index != -1) { - var index = Items.IndexOf(item); - - if (index != -1) - { - var container = Owner.ItemContainerGenerator.ContainerFromIndex(index); - container?.BringIntoView(); - } + var container = Owner.ItemContainerGenerator.ContainerFromIndex(index); + container?.BringIntoView(); } } diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs index d27de7a80d..2139c85f31 100644 --- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs +++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs @@ -289,20 +289,15 @@ namespace Avalonia.Controls.Presenters break; } - return ScrollIntoView(newItemIndex); + return ScrollIntoViewCore(newItemIndex); } /// - public override void ScrollIntoView(object item) + public override void ScrollIntoView(int index) { - if (Items != null) + if (index != -1) { - var index = Items.IndexOf(item); - - if (index != -1) - { - ScrollIntoView(index); - } + ScrollIntoViewCore(index); } } @@ -514,7 +509,7 @@ namespace Avalonia.Controls.Presenters /// /// The item index. /// The container that was brought into view. - private IControl ScrollIntoView(int index) + private IControl ScrollIntoViewCore(int index) { var panel = VirtualizingPanel; var generator = Owner.ItemContainerGenerator; diff --git a/src/Avalonia.Controls/Presenters/ItemsPresenter.cs b/src/Avalonia.Controls/Presenters/ItemsPresenter.cs index ab40fbd53b..51e6b80d60 100644 --- a/src/Avalonia.Controls/Presenters/ItemsPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ItemsPresenter.cs @@ -120,9 +120,9 @@ namespace Avalonia.Controls.Presenters return Virtualizer?.GetControlInDirection(direction, from); } - public override void ScrollIntoView(object item) + public override void ScrollIntoView(int index) { - Virtualizer?.ScrollIntoView(item); + Virtualizer?.ScrollIntoView(index); } /// diff --git a/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs b/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs index ef1f277162..f120d74b9a 100644 --- a/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs +++ b/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs @@ -142,7 +142,7 @@ namespace Avalonia.Controls.Presenters } /// - public virtual void ScrollIntoView(object item) + public virtual void ScrollIntoView(int index) { } diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs index b1a4379cae..dc08448cd1 100644 --- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs @@ -339,11 +339,17 @@ namespace Avalonia.Controls.Primitives base.EndInit(); } + /// + /// Scrolls the specified item into view. + /// + /// The index of the item. + public void ScrollIntoView(int index) => Presenter?.ScrollIntoView(index); + /// /// Scrolls the specified item into view. /// /// The item. - public void ScrollIntoView(object item) => Presenter?.ScrollIntoView(item); + public void ScrollIntoView(object item) => ScrollIntoView(IndexOf(Items, item)); /// /// Tries to get the container that was the source of an event. @@ -665,12 +671,9 @@ namespace Avalonia.Controls.Primitives { if (e.PropertyName == nameof(SelectionModel.AnchorIndex) && AutoScrollToSelectedItem) { - var index = Selection.AnchorIndex.GetSize() > 0 ? Selection.AnchorIndex.GetAt(0) : -1; - var item = index != -1 ? ElementAt(Items, index) : null; - - if (item != null) + if (Selection.AnchorIndex.GetSize() > 0) { - ScrollIntoView(item); + ScrollIntoView(Selection.AnchorIndex.GetAt(0)); } } } diff --git a/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs b/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs index b967b40c0d..bf29381eab 100644 --- a/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs +++ b/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs @@ -81,7 +81,7 @@ namespace Avalonia.Dialogs if (indexOfPreselected > 1) { - _filesView.ScrollIntoView(model.Items[indexOfPreselected - 1]); + _filesView.ScrollIntoView(indexOfPreselected - 1); } } } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index 7a6cf0fba7..05124a282c 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -575,7 +575,7 @@ namespace Avalonia.Controls.UnitTests.Presenters target.Arrange(Rect.Empty); // Check for issue #591: this should not throw. - target.ScrollIntoView(items[0]); + target.ScrollIntoView(0); } } @@ -729,7 +729,7 @@ namespace Avalonia.Controls.UnitTests.Presenters var last = (target.Items as IList)[10]; - target.ScrollIntoView(last); + target.ScrollIntoView(10); Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset); Assert.Same(target.Panel.Children[9].DataContext, last); @@ -746,12 +746,12 @@ namespace Avalonia.Controls.UnitTests.Presenters var last = (target.Items as IList)[10]; - target.ScrollIntoView(last); + target.ScrollIntoView(10); Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset); Assert.Same(target.Panel.Children[9].DataContext, last); - target.ScrollIntoView(last); + target.ScrollIntoView(10); Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset); Assert.Same(target.Panel.Children[9].DataContext, last);