我有一个简单的DataGrid和RowDetails。RowDetails包含另一个DataGrid。当RowDetails崩溃时,滚动正常工作,就像您所期望的那样。但是,当RowDetails可见时,只要RowDetails在光标下面滚动,滚动就会停止。我猜发生的事情是,它试图滚动DataGrid的细节,但它甚至没有滚动条。滚动的唯一方法是将光标从RowDetails中移开。但是,在一个具有多个DataGrid的RowDetails中,所有的DataGrid都有一个与父DataGrid一样宽的DataGrid,这真的很烦人。
而且,这似乎是一件简单的事情,但我找不到任何关于这一点。那么,我如何防止RowDetails破坏我的滚动呢?
发布于 2015-10-29 11:19:24
我找到了解决办法。问题是DateGrid而不是RowDetails,所以这也适用于ScrollViewers中的所有DataGrids。
第一种方法是将IsHitTestVisible设置为false。然后DataGrid将被光标忽略,不会阻止滚动。这样做的缺点是光标将完全忽略它,因此您甚至不能再单击DataGrid中的内容了。由于这通常是必要的,对我的情况也是如此,这不是一个很好的解决办法。
因此,第二种也是更好的方法是捕捉内部DataGrid上的滚动事件,并将其传递给外部DataGrid或任何应该滚动的东西。我们可以通过PreviewMouseWheel事件的DataGrid来完成这个任务。然后我们可以像这样滚动外部ScrollViewer:
ScrollViewer.ScrollToVerticalOffset(ScrollViewer.ContentVerticalOffset - e.Delta);在此发现:DataGrids over ScrollViewer prevent it to scroll
如果外部控件是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。测试如何将其应用于应用程序。为了获得与外部DataGrid相同的滚动,我不得不将其除以2.5。
https://stackoverflow.com/questions/33387509
复制相似问题