2010-11-09 3 views
9

Я пытаюсь выяснить, как сделать что-то, что (должно) быть довольно простым.WPF ListBox OnScroll Event

Я хочу, чтобы событие было запущено в любое время, когда элемент управления ListBox прокручивается. ListBox динамически создается, поэтому мне нужен способ сделать это из кода (хотя XAML-решения также оценены, так как это дает мне возможность начать с).

Заранее благодарим за любые идеи.

ответ

11

В XAML вы можете получить доступ к ScrollViewer и добавлять события, как этот

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

Update
Это probablly то, что вам нужно в коде позади

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

С реализацией 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

Очень хороший ответ. У меня не было времени для его реализации, чтобы убедиться, что все сделано правильно, но это звучит правильно. Спасибо за помощь. – riwalk