2010-05-14 5 views

Respuesta

8

Tome un vistazo a CodeProject Scroll Synchronization

+0

¡Gracias por la respuesta rápida! Esto era exactamente lo que estaba buscando, ya lo tengo implementado y funciona :) – stevosaurus

2

El proyecto de desplazamiento de sincronización no funciona para cuadrícula de datos, ya que no expone ScrollToVerticalOffset

6

yo era capaz de superar este problema a través de algunos hacks reflexión:

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

y el propio código es:

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 para hack de reflexión. utilizado esto junto con el artículo del proyecto de código para lograr una implementación de propiedad adjunta en funcionamiento para WPF Datagrid –

0

La mejor manera que he usado hasta ahora es usar la clase VisualTreeHelper para encontrar el objeto correcto ScrollViewer (cuadrícula o sin cuadrícula). Lo he usado en varios proyectos.

probar este si alguno de ustedes lo necesitan:

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: Me suelen utilizar clases ListBox y pasaría directamente a esta función.

Programación feliz :)

Cuestiones relacionadas