2013-04-06 34 views
0

我使用列表框显示数值的列表,其中所选值将应用于对象并保存。我的想法是将列表框上的高度设置为仅显示一行。当然,这会导致垂直的滑动条出现,并且没有滚动体,这正是我正在寻找的。WPF列表框 - 检测滚动条向上/向下按钮单击

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

所以,有些Intel的感觉狩猎之后,我就开始寻找可能的方法来增加与在列表框滚动按钮点击所选择的价值,但我无法找到实际使用他们什么。

我发现上的滚动条的身体,当点击描述行动,还有人使用设计师的职位加入按钮对列表框的指数变化。但是,滚动条主体对于列表框的短高度是不可见的,当我已经有了这两个可用的并且执行大部分工作时,添加更多按钮似乎很愚蠢。

我也发现一篇文章描述了类似的东西,但是使用了一个listview。但是,我不愿意在这时换掉控件,因为我真的认为应该可以在我目前使用的控件上的某个地方使用该控件。

所以,我想我要的是解决一个列表框控件的垂直滚动条按钮的Click事件处理程序的方式。

任何帮助将不胜感激。 (感谢所有人,对于其他1000件事情,我没有必要在这里解答!)

+0

这听起来像你真正想要的是一个带有上一个和下一个按钮的文本框。 – Jesse 2013-04-06 16:40:01

+0

感谢您的建议,但:我也发现一篇文章描述了类似的东西,但使用了一个listview。但是,我不愿意在这时换掉控件,因为我真的认为应该可以在我目前使用的控件上的某个地方使用该控件。 – Stickman 2013-04-06 16:43:27

+0

听起来像你想要一个数字上下控制。扩展wpf工具包中的控件是否有用? – Phil 2013-04-06 17:23:10

回答

0

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

我只是想通,有可能是一个可行的选择,因为这特定的控制最初并不是框架的一部分。我也有很多工作,并且非常喜欢结果,以及它采用主题的方式。

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

我最终做的是有点复杂,它是值得的,但用一个有用的帮助函数很容易。我需要为我的目标类型搜索“可视化树”。从那里我能够获得足够的功能来完成。

第一: 使用一个辅助功能,我发现here(感谢布鲁诺),我能够加入到我的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; 
    } 

感谢。

相关问题