我聽說過菲爾和你的權利。我正在替換數字上下。
我只是想通,有可能是一個可行的選擇,因爲這特定的控制最初並不是框架的一部分。我也有很多工作,並且非常喜歡結果,以及它採用主題的方式。
由於此應用程序的核心將成爲未來應用的一個起點,我希望包括此功能,並準備爲它做一些工作。
我最終做的是有點複雜,它是值得的,但用一個有用的幫助函數很容易。我需要爲我的目標類型搜索「可視化樹」。從那裏我能夠獲得足夠的功能來完成。
第一: 使用一個輔助功能,我發現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;
}
感謝。
這聽起來像你真正想要的是一個帶有上一個和下一個按鈕的文本框。 – Jesse 2013-04-06 16:40:01
感謝您的建議,但:我也發現一篇文章描述了類似的東西,但使用了一個listview。但是,我不願意在這時換掉控件,因爲我真的認爲應該可以在我目前使用的控件上的某個地方使用該控件。 – Stickman 2013-04-06 16:43:27
聽起來像你想要一個數字上下控制。擴展wpf工具包中的控件是否有用? – Phil 2013-04-06 17:23:10