WPF嵌套DataGrid模板列:鼠标滚轮滚动失效问题求助
解决方案
方法一:直接将滚轮事件传递给主DataGrid
你已经捕获了子DataGrid的PreviewMouseWheel事件,只需在事件处理中将事件转发给主DataGrid即可:
private void SourcePersonsFieldValuesDataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e) { // 标记事件已处理,避免子DataGrid消耗事件 e.Handled = true; // 构造新的滚轮事件并传递给主DataGrid var forwardedEvent = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta) { RoutedEvent = UIElement.MouseWheelEvent }; SourcePersonsDataGrid.RaiseEvent(forwardedEvent); }
方法二:手动控制主DataGrid的滚动条
如果需要自定义滚动步长,可以先获取主DataGrid内部的ScrollViewer,再根据Delta值调整滚动位置:
首先添加一个获取DataGrid内置ScrollViewer的辅助方法:
private ScrollViewer GetDataGridScrollViewer(DataGrid dataGrid) { if (VisualTreeHelper.GetChildrenCount(dataGrid) == 0) return null; var border = VisualTreeHelper.GetChild(dataGrid, 0) as Border; return border?.Child as ScrollViewer; }
然后修改事件处理逻辑:
private void SourcePersonsFieldValuesDataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e) { var mainScrollViewer = GetDataGridScrollViewer(SourcePersonsDataGrid); if (mainScrollViewer == null) return; // Delta为正代表向上滚动,负代表向下滚动,20是可调整的滚动步长 var scrollStep = e.Delta > 0 ? -20 : 20; mainScrollViewer.ScrollToVerticalOffset(mainScrollViewer.VerticalOffset + scrollStep); e.Handled = true; }
方法三:声明式禁用子DataGrid的滚动拦截
如果子DataGrid永远不需要滚动(内容全部可见),直接在XAML中禁用其滚动功能,这样它不会捕获滚轮事件,事件会自动冒泡到主DataGrid:
<DataGrid Name="SourcePersonsFieldValuesDataGrid" ItemsSource="{Binding FieldValues}" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="False" AutoGenerateColumns="False" HeadersVisibility="None" ScrollViewer.VerticalScrollBarVisibility="Disabled">
内容的提问来源于stack exchange,提问作者FunkyDexter
相关产品推荐
相关产品推荐

