2010-11-09 5 views
9

J'essaie de comprendre comment faire quelque chose qui (devrait) être assez simple.WPF ListBox OnScroll Event

Ce que je veux, c'est déclencher un événement à chaque fois qu'un contrôle ListBox est défilé. Le ListBox est créé dynamiquement, donc j'ai besoin d'un moyen de le faire à partir du code derrière (mais les solutions XAML sont appréciées aussi, car cela me donne quelque chose à partir de laquelle commencer).

Merci d'avance pour vos idées.

Répondre

11

En XAML vous pouvez accéder à la ScrollViewer et ajouter des événements comme celui-ci

<ListBox Name="listBox" 
     ScrollViewer.ScrollChanged="listBox_ScrollChanged" 

Mise à jour
Ceci est probablly ce dont vous avez besoin dans le code derrière

List<ScrollBar> scrollBarList = GetVisualChildCollection<ScrollBar>(listBox); 
foreach (ScrollBar scrollBar in scrollBarList) 
{ 
    if (scrollBar.Orientation == Orientation.Horizontal) 
    { 
     scrollBar.ValueChanged += new RoutedPropertyChangedEventHandler<double>(listBox_HorizontalScrollBar_ValueChanged); 
    } 
    else 
    { 
     scrollBar.ValueChanged += new RoutedPropertyChangedEventHandler<double>(listBox_VerticalScrollBar_ValueChanged); 
    } 
} 

Avec une mise en œuvre de GetVisualChildCollection

public static List<T> GetVisualChildCollection<T>(object parent) where T : Visual 
{ 
    List<T> visualCollection = new List<T>(); 
    GetVisualChildCollection(parent as DependencyObject, visualCollection); 
    return visualCollection; 
} 
private static void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : Visual 
{ 
    int count = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < count; i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(parent, i); 
     if (child is T) 
     { 
      visualCollection.Add(child as T); 
     } 
     else if (child != null) 
     { 
      GetVisualChildCollection(child, visualCollection); 
     } 
    } 
} 
+0

Très belle réponse. Je n'ai pas eu le temps de l'implémenter pour voir si tout fonctionne correctement, mais ça sonne bien. Merci de votre aide. – riwalk