【问题标题】:WPF ListBox - Detect Scrollbar Up/Down Button clickWPF ListBox - 检测滚动条向上/向下按钮单击
【发布时间】:2013-04-06 16:34:12
【问题描述】:

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

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

因此,在进行了一些智能搜索之后,我开始寻找通过单击列表框滚动条按钮来增加所选值的可能方法,但我找不到任何实际使用它们的方法。

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

我还发现了一篇描述类似内容的帖子,但使用的是列表视图。但是,我不希望此时必须将控件换成我认为应该在我当前使用的控件的某个位置提供的一项功能。

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

任何帮助将不胜感激。 (谢谢大家,还有 1000 件其他事情我不必在这里发帖解决!)

【问题讨论】:

  • 听起来你真正想要的是一个带有上一个和下一个按钮的文本框。
  • 感谢您的建议,但是:我还发现了一篇描述类似内容的帖子,但使用的是列表视图。但是,我不希望此时必须将控件换成我认为应该在我当前使用的控件的某个位置可用的一项功能。
  • 听起来你想要一个数字上下控制。扩展的 wpf 工具包中的控件有用吗?

标签: wpf button listbox wpf-controls scrollbar


【解决方案1】:

我听说过那个菲尔,还有你的权利。我正在替换数字上下。

我只是想可能有一个可行的替代方案,因为该特定控件最初不是框架的一部分。我也得到了很多工作,非常喜欢结果,以及它抓住主题的方式。

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

我最终做的事情有点复杂,但它是值得的,但通过一个有用的辅助函数变得很容易。我需要在“视觉树”中搜索我的目标类型。从那里我能够访问足够的功能来完成。

首先: 使用我找到的辅助函数 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;
    }

再次感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2016-01-06
    • 2013-06-23
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多