ListView 的精确滚动位置

Exact scroll position of ListView

我想保存 ListView 的位置,然后加载它,这样 ListView 就会显示在之前的确切位置上。 ListView.ScrollIntoView()不够精确。

使用VerticalOffset property to get the offset, then ScrollToVerticalOffset重置它。由于这些在 ScrollViewer 上,您需要从可视化树中提取它。请注意,此代码假定您没有重新模板化 ListView。此示例假定对象名为 myListView:

ScrollViewer scrollViewer;
double offset;

public MainPage()
{
  this.InitializeComponent();

  // Have to wait until the templates have been created
  SizeChanged += MainPage_SizeChanged;
}

void MainPage_SizeChanged(object sender, SizeChangedEventArgs e)
{
  // Assumes default template
  scrollViewer = VisualTreeHelper.GetChild(
    VisualTreeHelper.GetChild(myListView, 0), 0) as ScrollViewer;

  // Not needed any more
  SizeChanged -= MainPage_SizeChanged;
}

private void GetOffsetClicked(object sender, RoutedEventArgs e)
{
  offset = scrollViewer.VerticalOffset;
}

private void SetOffsetClicked(object sender, RoutedEventArgs e)
{
  scrollViewer.ScrollToVerticalOffset(offset);
}