2010-05-14 18 views

Odpowiedz

2

Projekt Scroll Synchronizacja nie działa dla DataGrid ponieważ nie narażać ScrollToVerticalOffset

6

udało mi się rozwiązać ten problem poprzez niektóre hacki refleksji:

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

a sam kod jest:

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 za hack do refleksji. użył tego w połączeniu z artykułem codeproject, aby uzyskać działającą implementację właściwości dla WPF Datagrid –

0

Najlepszym sposobem, jaki dotychczas stosowałem, jest użycie klasy VisualTreeHelper w celu znalezienia właściwego obiektu ScrollViewer (siatka lub brak siatki). Używałem tego w kilku projektach.

Spróbuj tego, czy ktoś z was jest to potrzebne:

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; 
} 

Uwaga: I zazwyczaj korzystają z klasy ListBox i przejdzie bezpośrednio do tej funkcji.

Happy programowanie :)

Powiązane problemy