我们可以通过获取ListView的ControlTemplate中存在的
ScrollViewer来实现这一点。如果您可以访问ScrollViewer,则会公开
很多不同的滚动方法。
首先,我们可以创建一个ListView,然后将此效果添加到其中:
<ListView ItemsSource="{Binding Percents}"
SelectionChanged="OnSelectionChanged"
x:Name="uiListView"/>
public List<int> Percents { get; set; }
public Window1()
{
InitializeComponent();
Percents = new List<int>();
for (int i = 1; i <= 100; i++)
{
Percents.Add(i);
}
this.DataContext = this;
}
我们还需要一些东西,可以用来从ListView中获取ScrollViewer。我以前使用过类似的东西来处理自定义滚动条,在这里也可以使用它。
public static DependencyObject GetScrollViewer(DependencyObject o)
{
if (o is ScrollViewer)
{ return o; }
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
{
var child = VisualTreeHelper.GetChild(o, i);
var result = GetScrollViewer(child);
if (result == null)
{
continue;
}
else
{
return result;
}
}
return null;
}
现在,我们只需要处理SelectionChanged事件。因为我们正在尝试将项目滚动到列表顶部,所以最好的选择是滚动到底部,然后重新向上滚动到所选项目。正如您所说,ScrollIntoView将滚动直到项目可见,所以一旦所选项目向上滚动到达顶部,它将停止,留下我们所选的项目在列表顶部。
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ScrollViewer scrollViewer = GetScrollViewer(uiListView) as ScrollViewer;
scrollViewer.ScrollToBottom();
uiListView.ScrollIntoView(e.AddedItems[0]);
}