2013-04-06 35 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; 
    } 

感謝。

相關問題