private static void DataGridLoaded(DataGrid dataGrid) { if (VisualTreeExHelper.FindChildren <ScrollViewer>(dataGrid).FirstOrDefault() is ScrollViewer scrollViewer) { SetSenderDataGrid(scrollViewer, dataGrid); scrollViewer.ScrollChanged += ScrollViewerOnScrollChanged; } }
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; }
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); }
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()); } }
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); } }