如何以编程方式滚动WPF列表视图?

是否可以以编程方式滚动WPF列表视图? 我知道winforms不会这样做,对吧?

我说的是向上或向下滚动50个单位等。不要一次滚动整个项目高度。

是的,您必须从ListView中获取ScrollViwer,或者只要您有权访问它,就可以使用它公开的方法或覆盖滚动。 您还可以通过获取主要内容区域并使用它的IScrollInfo接口实现来滚动 。

这里有一个小帮手可以获得类似ListBox,ListView等的ScrollViwer组件。

public static DependencyObject GetScrollViewer(DependencyObject o) { // Return the DependencyObject if it is a ScrollViewer 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; } 

然后你可以像这样使用.LineUp()和.LineDown():

 private void OnScrollUp(object sender, RoutedEventArgs e) { var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer; if (scrollViwer != null) { // Logical Scrolling by Item // scrollViwer.LineUp(); // Physical Scrolling by Offset scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3); } } private void OnScrollDown(object sender, RoutedEventArgs e) { var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer; if (scrollViwer != null) { // Logical Scrolling by Item // scrollViwer.LineDown(); // Physical Scrolling by Offset scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3); } }        

LineUp和LineDown公开的逻辑滚动仍然按项目滚动,如果你想按设定的数量滚动,你应该使用我上面使用过的ScrollToHorizo​​ntal / VerticalOffset。 如果你想要一些更复杂的滚动,那么看看我在另一个问题中提供的答案。

你试过ScrollIntoView吗? 或者,如果它不是您进入视图的特定项目,但是偏离当前位置,则可以使用BringIntoView 。