如何防止DataGrid RowDetails停止滚动?

时间:2015-10-28 09:37:41

标签: c# wpf datagrid

我有一个带RowDetails的简单DataGrid。 RowDetails包含另一个DataGrid。当RowDetails折叠时,滚动按正常方式正常工作。但是当RowDetails可见时,只要RowDetails在光标下方滚动,滚动就会停止。我想发生的事情是它试图在细节中滚动DataGrid但它甚至没有滚动条。滚动的唯一方法是将光标移离RowDetails。但是在一个包含多个RowDetails的DataGrid中,所有的RowGetails都有一个DataGrid,其宽度与父DataGrid相同,这真的很烦人。

此外,修复似乎很简单,但我找不到任何相关内容。那么如何防止RowDetails弄乱我的滚动?

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。问题是DateGrid而不是RowDetails,因此这也适用于ScrollViewers中的所有DataGrids。

执行此操作的第一种方法是将IsHitTestVisible设置为false。然后光标将忽略DataGrid,并且不会阻止滚动。这样做的缺点是光标会完全忽略它,所以你甚至不能再点击DataGrid中的东西了。因为这通常是必要的,而且对我而言,这不是一个很好的解决方案。

所以第二种更好的方法是捕获内部DataGrid上的滚动事件,并将其传递给外部DataGrid或任何应该滚动的内容。我们可以使用DataGrid的PreviewMouseWheel事件来完成此操作。然后我们可以像这样滚动外部ScrollViewer:

ScrollViewer.ScrollToVerticalOffset(ScrollViewer.ContentVerticalOffset - e.Delta);

在此处找到:DataGrids over ScrollViewer prevent it to scroll

如果外部Control是DataGrid,我们首先必须得到它的ScrollViewer:

private static ScrollViewer GetScrollbar(DependencyObject dep)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dep); i++)
    {
        var child = VisualTreeHelper.GetChild(dep, i);
        if (child != null && child is ScrollViewer)
            return child as ScrollViewer;
        else
        {
            ScrollViewer sub = GetScrollbar(child);
            if (sub != null)
                return sub;
        }
    }
    return null;
}

ScrollViewer scrollView = GetScrollbar(myDataGrid);

代码来自:http://blog.kervinramen.com/2010/10/wpf-datagrid-controlling-scrollbar.html

如果内部DataGrid有一个可以滚动的内容,我们需要添加条件来传递滚动,如下所示:

if (e.Delta > 0 && sv.VerticalOffset == 0 || e.Delta < 0 && 
    ScrollViewer.VerticalOffset == ScrollViewer.ScrollableHeight)

在此之后,DataGrid的行为就像TextBox一样。如果光标位于其上方,它将自动滚动直到它到达底部。然后它会将滚动传递给外部控件并让它滚动。向上滚动也一样。

e.Delta也总是120或-120。测试这适用于您的应用程序。我不得不将它除以2.5以获得与外部DataGrid相同的滚动。