如何在Windows 8 Metro App中获取GridView.Selected项目的滚动位置

我正在使用代码选择gridview项目,所以我还需要我的gridview在选定项目的位置滚动,我尝试了GridView.ScrollintoPosition()但它无法正常工作。 有没有办法获得SelectedItem的Scroll位置 ,以便我可以使用scrollViewer1.ScrollToHorizo​​ntalOffsetWithAnimation()滚动它

这里有几个方面。

  1. 我认为只需gridView.ScrollIntoView(gridView.SelectedItem)可以了。 它有点异步,所以代码不会立即看到它滚动,但是如果你做了类似await Task.Delay(100)东西 – 你可能会看到更新的ScrollViewer偏移量。
  2. 如果你想要一个动画滚动 – 你可以使用WinRT XAML Toolkit的ScrollViewer.ScrollToHorizontalOffsetWithAnimation()扩展,或者如果你的目标是Windows 8.1 – 你可以使用支持动画滚动的新ScrollViewer.ChangeView()方法。
    1. 您需要首先在GridView模板中获取ScrollViewer的实例。 您可以使用GetTemplatePart()VisualTreeHelper
    2. 现在,您需要在ScrollViewer中获取SelectedItem的UI容器的位置。 要做到这一点,你首先需要容器本身,你可以使用var container = gv.ContainerFromItem(gv.SelectedItem) ,但如果GridView var container = gv.ContainerFromItem(gv.SelectedItem)被虚拟化 – 你可能无法做到这一点,因为SelectedItem可能不会有它的UI容器。 在这种情况下我会简单地做非动画滚动有很多原因 – 主要是性能,但如果你真的需要 – 你可能能够根据项目集合和项目大小中SelectedItem的索引来计算位置,但它可能有点复杂。
    3. 一旦你得到容器,你可以得到它的位置,如var horizontalOffset = gridViewItem.TransformToVisual(scrollViewer).TransformPoint(new Point()).X;
    4. 此时,您应该可以使用您喜欢的方法滚动到偏移量。