WPF ListBox - 检测滚动条向上/向下按钮单击

时间:2013-04-06 16:34:12

标签: wpf button listbox wpf-controls scrollbar

我正在使用列表框显示数值列表,其中所选值应用于对象并保存。我有想法将列表框上的高度设置为足以显示单行。当然这会导致垂直的scollbar出现,并且没有滚动体,这正是我所寻找的。

当我单击列表框滚动条上的向上/向下箭头时,它会正确地滚动下一个项目进入视图。但是,未选择该项目。我立即遇到了保存实际选定值的问题,而不是视图中的值。这是因为它需要在滚动条按钮后单击数字才能实际选择该值,这不是很直观。

因此,经过一些智能搜索,我开始搜索可能的方法来通过列表框滚动条按钮的点击来增加所选值,但我找不到任何实际使用它们的东西。

我找到了一些帖子,用于描述单击滚动条主体时的操作,还有一些帖子使用设计器添加的按钮来执行列表框上的索引更改。但是,滚动条主体对列表框的短高度是不可见的,当我已经有两个按钮可用并完成大部分工作时,添加更多按钮似乎很愚蠢。

我还发现了一篇描述类似内容的帖子,但是使用了listview。但是,我不想在这一点上交换控件,因为我认为应该可以在我正在使用的控件上的某个地方使用一个功能。

所以,我想我正在寻找的是一种解决列表框控件上垂直滚动条按钮的click事件处理程序的方法。

非常感谢任何帮助。 (谢谢大家,对于其他1000件事,我没有必要在这里解决!)

1 个答案:

答案 0 :(得分:0)

我听说过菲尔和你的权利。我正在替换数字上下调。

我只是认为可能存在一种可行的替代方案,因为该特定控制本来不是框架的一部分。我也有很多工作,非常喜欢结果,以及它采用主题的方式。

由于此应用程序的核心将成为未来应用程序的起点,我想要包含此功能,并准备为它做一些工作。

我最终做的事情有点复杂,值得,但使用有用的辅助函数变得容易。我需要在'Visual Tree'中搜索我的目标类型。从那里我可以访问足够的功能来完成。

第一: 使用辅助函数我发现here(感谢Bruno)我能够将它添加到我的Loaded事件中:

private Double currentVerticalOffset;
private void Page_Loaded_1(object sender, RoutedEventArgs e)
    {            
        ScrollViewer sv = Helpers.ViewHelpers.ListBoxHelper.FindVisualChild<ScrollViewer>(listbox);
        sv.ScrollChanged += HandleRankScrollChange;
        currentVerticalOffset = sv.VerticalOffset;
    }

然后,我处理滚动更改事件:

private void HandleRankScrollChange(object sender, ScrollChangedEventArgs e)
    {
        ScrollViewer sv = Helpers.ViewHelpers.ListBoxHelper.FindVisualChild<ScrollViewer>(listbox);

        if (sv.VerticalOffset > currentVerticalOffset)
        {
            Helpers.ViewHelpers.ListBoxHelper.SelectNextItem(listbox);
        }

        if (sv.VerticalOffset < currentVerticalOffset)
        {
            Helpers.ViewHelpers.ListBoxHelper.SelectPreviousItem(listbox);
        }
        currentVerticalOffset = sv.VerticalOffset;
    }

我在这里打电话的助手非常简单,但同样,这将成为一个基础套件,所以这些方法可能会再次派上用场。

public static void SelectNextItem(ListBox lb)
    {
        if (lb.SelectedIndex < lb.Items.Count)
        {
            lb.SelectedIndex++;
        }
    }

    public static void SelectPreviousItem(ListBox lb)
    {
        if (lb.SelectedIndex > 0)
        {
            lb.SelectedIndex--;
        }
    }

布鲁诺的助手功能

public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
            if (child != null && child is childItem)
            {
                return (childItem)child;
            }
            else
            {
                childItem childOfChild = FindVisualChild<childItem>(child);
                if (childOfChild != null)
                {
                    return childOfChild;
                }
            }
        }
        return null;
    }

再次感谢。