2010-11-09 7 views
9

Sto cercando di capire come fare qualcosa che dovrebbe (dovrebbe) essere abbastanza semplice.WPF ListBox Evento OnScroll

Quello che voglio è ottenere un evento che si attivi ogni volta che si scorre un controllo ListBox. Il ListBox viene creato dinamicamente, quindi ho bisogno di un modo per farlo dal codice sottostante (comunque le soluzioni XAML sono apprezzate, dato che mi danno qualcosa da cui partire).

Grazie in anticipo per qualsiasi idea.

risposta

11

in XAML è possibile accedere al ScrollViewer e aggiungere eventi come questo

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

Aggiornamento
Questo è probablly quello che ti serve in codice dietro

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

Con un'implementazione di 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

Risposta molto bella. Non ho avuto il tempo di implementarlo per vedere se fa tutto correttamente, ma sicuramente suona bene. Grazie per l'aiuto. – riwalk