2010-05-14 7 views

risposta

8

Date un'occhiata a CodeProject Scroll Synchronization

+0

Grazie per la rapida risposta! Questo era esattamente quello che stavo cercando, l'ho già implementato e funzionante :) – stevosaurus

2

Il progetto Scroll sincronizzazione non funziona per DataGrid, perché non espone ScrollToVerticalOffset

6

ero in grado di superare questo problema con alcuni hack di riflessione:

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

e il codice stesso è:

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 per riflessione hack. usato questo in congiunzione con l'articolo codeproject per ottenere un'implementazione di proprietà collegata funzionante per Datagrid di WPF –

0

Il modo migliore che ho utilizzato finora è utilizzare la classe VisualTreeHelper per trovare l'oggetto ScrollViewer corretto (griglia o nessuna griglia). L'ho usato in diversi progetti.

Prova questa se qualcuno di voi ne ha bisogno:

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

Nota: Io di solito uso classi ListBox e passerei direttamente a questa funzione.

Buona programmazione :)