2010-05-14 3 views

Répondre

8

Jetez un oeil à CodeProject Scroll Synchronization

+0

Merci pour la réponse rapide! C'était exactement ce que je cherchais, je l'ai déjà mis en œuvre et je travaille :) – stevosaurus

2

Le projet de défilement La synchronisation ne fonctionne pas pour Datagrid, car il n'expose pas ScrollToVerticalOffset

6

j'ai pu surmonter ce problème par certains hacks de réflexion:

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

et le code lui-même est:

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 pour la réflexion hack. utilisé en conjonction avec l'article codeproject pour obtenir une implémentation de propriété jointe fonctionnant pour WPF Datagrid –

0

La meilleure façon que j'ai utilisé jusqu'ici est d'utiliser la classe VisualTreeHelper pour trouver l'objet ScrollViewer correct (grille ou pas de grille). J'ai utilisé cela dans plusieurs projets.

Essayez ceci si l'un de vous en avez besoin:

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

Note: J'utilise généralement des classes ListBox et passerais directement à cette fonction. Bonne programmation :)

Questions connexes