同步2个WPF DataGrids的滚动位置

Phi*_*mid 6 wpf datagrid scroll

我试图同步 2 WPF DataGrid控件的水平滚动位置.

我正在订阅第一个DataGrid 的ScrollChanged事件:

<toolkit:DataGrid x:Name="SourceGrid" ScrollViewer.ScrollChanged="SourceGrid_ScrollChanged">
Run Code Online (Sandbox Code Playgroud)

我有第二个DataGrid:

<toolkit:DataGrid x:Name="TargetGrid">
Run Code Online (Sandbox Code Playgroud)

在我尝试使用的事件处理程序中IScrollInfo.SetHorizontalOffset,但是唉,DataGrid没有公开IScrollInfo:

private void SourceGrid_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    ((IScrollInfo)TargetGrid).SetHorizontalOffset(e.HorizontalOffset);
    // cast to IScrollInfo fails
}
Run Code Online (Sandbox Code Playgroud)

还有另一种方法来实现这一目标吗?或者TargetGrid上是否有另一个元素暴露了IScrollInfo实现滚动位置同步所必需的元素?

顺便说一下,我使用的是冻结列,所以我不能用ScrollViewers包装两个DataGrid控件.

Phi*_*mid 2

根据 Microsoft 产品组的说法,推荐的方法是遍历可视化树来查找 ScrollViewer,正如他们在 Codeplex 上的回答中所解释的那样

  • 当用户更改视觉主题时要小心 - 控件然后会获取新模板(=新视觉树),并且您将引用错误的滚动查看器。您应该在 OnApplyTemplate 中做出反应,并在每次调用时查找实际的 ScrollViewer。请参阅http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onapplytemplate.aspx (2认同)