WPF列表框-检测滚动条向上/向下按钮单击

WPF列表框-检测滚动条向上/向下按钮单击,wpf,button,listbox,wpf-controls,scrollbar,Wpf,Button,Listbox,Wpf Controls,Scrollbar,我使用一个列表框来显示一个数值列表,其中选定的值被应用到一个对象并被保存。我的想法是将列表框上的高度设置为刚好足以显示一行。当然,这会导致出现垂直的滚动条,并且没有滚动体,这正是我要找的 当我单击列表框滚动条上的向上/向下箭头时,它会将下一项正确地滚动到视图中。但是,未选择该项目。我立即遇到了保存的实际选定值而不是视图中的值的问题。这是因为它需要点击滚动条按钮后的数字来实际选择值,这不是很直观 所以,在一些英特尔感官搜索之后,我开始寻找可能的方法,通过单击列表框滚动条按钮来增加所选值,但我找不到

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

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

所以,在一些英特尔感官搜索之后,我开始寻找可能的方法,通过单击列表框滚动条按钮来增加所选值,但我找不到任何实际使用它们的方法

我发现了一些帖子,这些帖子描述了单击滚动条主体时的操作,还有一些帖子使用designer添加的按钮在列表框上执行索引更改。然而,滚动条主体在列表框的较短高度是不可见的,当我已经有了这两个按钮并完成了大部分工作时,添加更多按钮似乎是愚蠢的

我还发现一篇文章描述了类似的东西,但使用了listview。但是,我不想在这个时候把控件换成一个我真的认为应该在我当前使用的控件的某个地方可用的特性

所以,我想我要寻找的是一种解决listbox控件上垂直滚动条按钮的click事件处理程序的方法

任何帮助都将不胜感激。
(谢谢大家,还有1000件我不需要在这里发帖就能解决的事情!)

我听说了菲尔,你的权利。我正在做一个数字上下替换

我只是认为可能有一个可行的替代方案,因为特定的控制最初不是框架的一部分。我也得到了它的大部分工作,真的很喜欢的结果,以及它拿起主题的方式

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

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

第一: 使用我发现的一个助手函数(感谢Bruno),我能够将其添加到我加载的事件中:

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;
    }
专用双电流垂直偏移量;
私有无效页面加载1(对象发送方,路由目标)
{            
ScrollViewer sv=Helpers.ViewHelpers.ListBoxHelper.FindVisualChild(listbox);
sv.ScrollChanged+=HandleRankScrollChange;
currentVerticalOffset=sv.VerticalOffset;
}
然后,我处理scroll changed事件:

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;
    }
private void HandleRankScrollChange(对象发送方,ScrollChangedEventArgs e)
{
ScrollViewer sv=Helpers.ViewHelpers.ListBoxHelper.FindVisualChild(listbox);
如果(sv.VerticalOffset>currentVerticalOffset)
{
Helpers.ViewHelpers.ListBoxHelper.SelectNextItem(listbox);
}
if(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--;
        }
    }
publicstaticvoid-SelectNextItem(列表框lb)
{
如果(磅选定指数<磅项目计数)
{
lb.SelectedIndex++;
}
}
公共静态作废SelectPreviousItem(列表框lb)
{
如果(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;
    }
公共静态childItem FindVisualChild(DependencyObject obj),其中childItem:DependencyObject
{
for(int i=0;i

再次感谢。

听起来你真正想要的是一个带有“上一步”和“下一步”按钮的文本框。谢谢你的建议,但是:我也发现了一篇文章,其中描述了类似的内容,但使用了listview。但是,我不想在这个时候把控件换成一个功能,我真的认为应该在我当前使用的控件的某个地方可用。听起来你想要一个数字上下控件。扩展wpf工具包中的控件是否有用?