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);
        }
Пример #2
0
        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);
        }