コード例 #1
0
 private static void DataGridLoaded(DataGrid dataGrid)
 {
     if (VisualTreeExHelper.FindChildren <ScrollViewer>(dataGrid).FirstOrDefault() is ScrollViewer scrollViewer)
     {
         SetSenderDataGrid(scrollViewer, dataGrid);
         scrollViewer.ScrollChanged += ScrollViewerOnScrollChanged;
     }
 }
コード例 #2
0
 void OnLoaded()
 {
     if (VisualTreeExHelper.FindItemsPanel(AssociatedObject) is not UniformGrid uniformGrid)
     {
         throw new Exception($"ItemsPanel must be of type {nameof(UniformGrid)}");
     }
     this.uniformGrid = uniformGrid;
     AssociatedObject.PreviewKeyDown += AssociatedObject_PreviewKeyDown;
 }
コード例 #3
0
            static (int, int)? ScrollViewerOnScrollChanged(ScrollViewer scrollViewer, ItemsControl dataGrid, ScrollChangedEventArgs a)
            {
                //AssociatedObject_ScrollChanged();

                if (VisualTreeExHelper.FindVisualChildren <ScrollBar>(scrollViewer).Single(s => s.Orientation == Orientation.Vertical) is ScrollBar verticalScrollBar)
                {
                    int totalCount   = dataGrid.Items.Count;
                    var firstVisible = verticalScrollBar.Value;
                    var lastVisible  = firstVisible + totalCount - verticalScrollBar.Maximum;

                    return((int)firstVisible, (int)lastVisible);
                }
                return(null);
            }
コード例 #4
0
        private static void ScrollViewerOnScrollChanged(object sender, ScrollChangedEventArgs e)
        {
            if (sender is ScrollViewer scrollViewer)
            {
                if (VisualTreeExHelper.FindChildren <ScrollBar>(scrollViewer).FirstOrDefault(s => s.Orientation == Orientation.Vertical) is ScrollBar verticalScrollBar)
                {
                    DataGrid dataGrid = GetSenderDataGrid(scrollViewer);

                    int totalCount   = dataGrid.Items.Count;
                    int firstVisible = (int)verticalScrollBar.Value;
                    int lastVisible  = (int)(firstVisible + totalCount - verticalScrollBar.Maximum);

                    SetVisibleItems(dataGrid, GetVisibibleItems(firstVisible, lastVisible, dataGrid).ToArray());
                }
            }
コード例 #5
0
        private void DataGridIsLoadedChanges()
        {
            if (VisualTreeExHelper.FindVisualChildren <ScrollViewer>(AssociatedObject).FirstOrDefault() is ScrollViewer scrollViewer)
            {
                // N.B this doesn't work well if VerticalScrollBar is used to scroll- works for mouse-wheel.
                if (MouseFactor > 1)
                {
                    scrollViewer.ScrollChanged += AssociatedObject_ScrollChanged;
                }
                scrollViewer
                .ScrollChanges()
                .Select(a => ScrollViewerOnScrollChanged(scrollViewer, AssociatedObject, a))
                .Where(a => a.HasValue)
                .Select(a => a !.Value)
                .Subscribe(a =>
                {
                    var(firstVisible, lastVisible) = a;
                    FirstIndex = firstVisible;
                    LastIndex  = lastVisible;
                    Size       = lastVisible - firstVisible + 1;
                });
            }

            void AssociatedObject_ScrollChanged(object sender, ScrollChangedEventArgs e)
            {
                if (scrollViewer.VerticalOffset == scrollPosition)
                {
                    return;
                }

                scrollPosition = scrollViewer.VerticalOffset + e.VerticalChange * MouseFactor;
                if (scrollPosition >= scrollViewer.ScrollableHeight)
                {
                    scrollViewer.ScrollToBottom();
                }
                else
                {
                    scrollViewer.ScrollToVerticalOffset(scrollPosition);
                }
            }