代码之家  ›  专栏  ›  技术社区  ›  riwalk

WPF列表框OnScroll事件

  •  10
  • riwalk  · 技术社区  · 14 年前

    我正在努力想办法做一些相当简单的事情。

    我想要的是在任何时候滚动列表框控件时触发一个事件。列表框是动态创建的,因此我需要一种从代码背后完成它的方法(不过,XAML解决方案也很受欢迎,因为它给了我一些可以开始的东西)。

    提前谢谢你的建议。

    1 回复  |  直到 6 年前
        1
  •  12
  •   archer    6 年前

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