You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 06:24:52