2010-05-14 34 views

回答

2

的滚动同步项目不适合Datagrid的工作,因为它不公开ScrollToVerticalOffset

6

我能够通过一些反映黑客来解决这个问题:

<DataGrid Name="DataGrid1" ScrollViewer.ScrollChanged="DataGrid1_ScrollChanged" /> 
<DataGrid Name="DataGrid2" /> 

和代码本身是:

private void DataGrid1_ScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
     if (e.HorizontalChange != 0.0f) 
     { 
      ScrollViewer sv = null; 
      Type t = DataGrid1.GetType(); 
      try 
      { 
       sv = t.InvokeMember("InternalScrollHost", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty, null, DataGrid2, null) as ScrollViewer; 
       sv.ScrollToHorizontalOffset(e.HorizontalOffset); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
+1

+1反射黑客。将其与codeproject文章一起使用以实现WPF Datagrid的工作附属属性实现 – 2012-02-07 13:23:30

0

我迄今使用的最佳方式是使用VisualTreeHelper类来查找正确的ScrollViewer对象(网格或无网格)。我在几个项目中使用过这个。

试试这个如果有的话,你需要它:

private static bool ScrollToOffset(DependencyObject n, double offset) 
{ 
    bool terminate = false; 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(n); i++) 
    { 
     var child = VisualTreeHelper.GetChild(n, i); 
     if (child is ScrollViewer) 
     { 
      (child as ScrollViewer).ScrollToVerticalOffset(offset); 
      return true; 
     } 
    } 
    if (!terminate) 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(n); i++) 
      terminate = ScrollToOffset(VisualTreeHelper.GetChild(n, i), offset); 
    return false; 
} 

注:我通常使用列表框类,并直接把它传递给这个函数。

快乐编程:)