ScrollViewer上的DataGrids阻​​止它滚动

我有多个DataGrids放置在ScrollViewer上。 这些DataGrids具有“height:auto”属性,因此我可以隐藏滚动条并查看所有内容。 唯一的问题是DataGrids占据了焦点,因此我无法滚动ScrollViewer。 这是一个属性,以保持对ScrollViewer的关注,但也保持DataGrids的行为(所以我可以选择元素)?

谢谢 !

除了我的场景有点复杂之外,我遇到了同样的问题。 我没有在ScrollViewer中使用DataGrid,而是在ScrollViewer中有一堆UserControl(称为ProductDataGrid,在下面定义):

ProductDataGrid.xaml:

  ...     

ProductPortfolioListView.xaml:

   ...        

Livsi提供的解决方案是正确的,但我的UserControl无法访问我的ScrollViewer,所以这是我的解决方案:

ProductPortfolioListView.xaml:

   ...        

ProductPortfolioListView.xaml.cs:

 void ProductDataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs args) { ProductScrollViewer.ScrollToVerticalOffset(ProductScrollViewer.ContentVerticalOffset - args.Delta; args.Handled = true; } 

请注意,这个解决方案的优点在于我可以将DataGrid与将要保存它们的Page分开,因此我实现了代码隔离以及更少的重复代码。 更好的是,我绝对利用RoutedEvents保持从Source到它的所有父对象的事实,直到有人处理它(在我的情况下是我的ProductScrollViewer)。

这是为时已晚,但我以这种方式解决了这个问题:我为DataGrid创建了PreviewMouseWheel事件并手动滚动了包装ScrollViewer

 private void dgInvoicesItems_PreviewMouseWheel(object sender, MouseWheelEventArgs e) { this.scrInvoice.ScrollToVerticalOffset(this.scrInvoice.ContentVerticalOffset - e.Delta); } 

尝试将DataGrid上的CanContentScroll设置为False,如下所示:

  

TopMouseScrollPriorityBehavior.TopMouseScrollPriority

您只需将以下附加属性设置为ScrollViewer

 public class TopMouseScrollPriorityBehavior { public static bool GetTopMouseScrollPriority(DependencyObject obj) { return (bool)obj.GetValue(TopMouseScrollPriorityProperty); } public static void SetTopMouseScrollPriority(DependencyObject obj, bool value) { obj.SetValue(TopMouseScrollPriorityProperty, value); } public static readonly DependencyProperty TopMouseScrollPriorityProperty = DependencyProperty.RegisterAttached("TopMouseScrollPriority", typeof(bool), typeof(TopMouseScrollPriorityBehavior), new PropertyMetadata(false, OnPropertyChanged)); private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var scrollViewer = d as ScrollViewer; if (scrollViewer == null) throw new InvalidOperationException($"{nameof(TopMouseScrollPriorityBehavior)}.{nameof(TopMouseScrollPriorityProperty)} can only be applied to controls of type {nameof(ScrollViewer)}"); if (e.NewValue == e.OldValue) return; if ((bool)e.NewValue) scrollViewer.PreviewMouseWheel += ScrollViewer_PreviewMouseWheel; else scrollViewer.PreviewMouseWheel -= ScrollViewer_PreviewMouseWheel; } private static void ScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e) { var scrollViewer = (ScrollViewer)sender; scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta); e.Handled = true; } } 

用法

    

其中b:是包含此行为的命名空间

触摸支持

要启用触摸支持,您可能还需要在DataGrid上将ScrollViewer.PanningMode设置为None ,并将相同的属性设置为VerticalFirst或顶级ScrollViewer上的其他值