public static (int firstVisibleItemIndex, int lastVisibleItemIndex, int centerItemIndex) GetVisibleIndexes(ListViewBase listViewBase, ItemsLayoutOrientation itemsLayoutOrientation) { int firstVisibleItemIndex = -1; int lastVisibleItemIndex = -1; int centerItemIndex = -1; var scrollViewer = listViewBase.GetFirstDescendant <ScrollViewer>(); var presenters = listViewBase.GetChildren <ListViewItemPresenter>(); if (presenters != null || scrollViewer == null) { int count = 0; foreach (ListViewItemPresenter presenter in presenters) { if (CollectionViewExtensions.IsListViewItemVisible(presenter, scrollViewer, itemsLayoutOrientation)) { if (firstVisibleItemIndex == -1) { firstVisibleItemIndex = count; } lastVisibleItemIndex = count; } count++; } centerItemIndex = (lastVisibleItemIndex + firstVisibleItemIndex) / 2; } return(firstVisibleItemIndex, lastVisibleItemIndex, centerItemIndex); }
void OnScrollViewChanged(object sender, ScrollViewerViewChangedEventArgs e) { var itemsViewScrolledEventArgs = new ItemsViewScrolledEventArgs { HorizontalOffset = _scrollViewer.HorizontalOffset, HorizontalDelta = _scrollViewer.HorizontalOffset - _previousHorizontalOffset, VerticalOffset = _scrollViewer.VerticalOffset, VerticalDelta = _scrollViewer.VerticalOffset - _previousVerticalOffset, }; _previousHorizontalOffset = _scrollViewer.HorizontalOffset; _previousVerticalOffset = _scrollViewer.VerticalOffset; var visibleIndexes = CollectionViewExtensions.GetVisibleIndexes(ListViewBase, ItemsLayoutOrientation.Vertical); itemsViewScrolledEventArgs.FirstVisibleItemIndex = visibleIndexes.firstVisibleItemIndex; itemsViewScrolledEventArgs.CenterItemIndex = visibleIndexes.centerItemIndex; itemsViewScrolledEventArgs.LastVisibleItemIndex = visibleIndexes.lastVisibleItemIndex; Element.SendScrolled(itemsViewScrolledEventArgs); }