我有一个带RowDetails的简单DataGrid。 RowDetails包含另一个DataGrid。当RowDetails折叠时,滚动按正常方式正常工作。但是当RowDetails可见时,只要RowDetails在光标下方滚动,滚动就会停止。我想发生的事情是它试图在细节中滚动DataGrid但它甚至没有滚动条。滚动的唯一方法是将光标移离RowDetails。但是在一个包含多个RowDetails的DataGrid中,所有的RowGetails都有一个DataGrid,其宽度与父DataGrid相同,这真的很烦人。
此外,修复似乎很简单,但我找不到任何相关内容。那么如何防止RowDetails弄乱我的滚动?
答案 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相同的滚动。