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);
}
我想保存 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);
}