Событие WPF ListBox OnScroll - PullRequest
       9

Событие WPF ListBox OnScroll

10 голосов
/ 10 ноября 2010

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

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

Заранее спасибо за любые идеи.

1 Ответ

12 голосов
/ 10 ноября 2010

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

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

Обновление
Это, вероятно, то, что вам нужно в коде:

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