我听说过那个菲尔,还有你的权利。我正在替换数字上下。
我只是认为可能有一个可行的替代方案,因为该特定控件最初不是框架的一部分。我也得到了很多工作,非常喜欢结果,以及它抓住主题的方式。
由于该应用程序的核心将成为未来应用程序的起点,因此我想包含此功能并准备为它做一些工作。
我最终做的事情有点复杂,但它是值得的,但通过一个有用的辅助函数变得容易了。我需要在“视觉树”中搜索我的目标类型。从那里我能够访问足够的功能来完成。
首先:使用我在这里找到的辅助函数(感谢 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;
}
再次感谢。