WPF中DataGrid,滚动条自动滚动如何取消

该问题来自社区帖: https://bbs.csdn.net/topics/617173608.为符合问答规范, 该问题经过ChatGPT优化

在 WPF 中的 DataGrid 中,如何取消滚动条自动滚动,当用户点击单元格时。

引用 皆我百晓生 小程序回复内容作答:
要取消 DataGrid 中滚动条的自动滚动行为,可以使用以下代码:

首先,在 DataGrid 的 Loaded 事件中添加以下代码:

private void dataGrid_Loaded(object sender, RoutedEventArgs e)
{
    ScrollViewer scrollViewer = GetVisualChild<ScrollViewer>(dataGrid);
    scrollViewer.PreviewMouseWheel += ScrollViewer_PreviewMouseWheel;
}

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    ScrollViewer scrollViewer = (ScrollViewer)sender;
    if (scrollViewer.IsMouseOver)
    {
        e.Handled = true;
    }
}

private static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
    T child = default(T);
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
        {
            child = GetVisualChild<T>(v);
        }
        if (child != null)
        {
            break;
        }
    }
    return child;
}

这里定义了一个 GetVisualChild 方法,它可以在可视化树中查找指定类型的子元素。

然后在 ScrollViewer 的 PreviewMouseWheel 事件中,将 e.Handled 设置为 true,以阻止自动滚动。

最后,在 XAML 文件中添加以下代码,将 dataGrid_Loaded 事件绑定到 DataGrid 的 Loaded 事件:

<DataGrid x:Name="dataGrid" Loaded="dataGrid_Loaded">
    <!-- DataGrid 的定义 -->
</DataGrid>

这样,当用户点击 DataGrid 的单元格时,滚动条就不会自动滚动了。