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
上的其他值
例