在Windows Phone 7中恢复列表框的确切滚动位置
问题描述:
我正在努力使应用程序很好地从墓碑中回来。该应用程序包含大型列表框,所以我最好喜欢在用户滚动列表框时滚动回到用户所在的位置。在Windows Phone 7中恢复列表框的确切滚动位置
很容易跳回到一个特定的SelectedItem - 不幸的是,我的应用从来不需要用户真正选择一个项目,他们只是滚动浏览它们。我真正想要的是某种MyListbox.ScrollPositionY,但似乎并不存在。
任何想法?
克里斯
答
你需要得到所使用的ListBox
内部,所以你可以抓住VerticalOffset
属性的值,然后调用SetVerticalOffset
方法ScrollViewer
的保持。
这要求您通过构成其内部的可视树从ListBox
下来。
我用这个方便的扩展类,你应该添加到您的项目(我得把这个了一个博客,因为我不停地重复它): -
public static class VisualTreeEnumeration
{
public static IEnumerable<DependencyObject> Descendents(this DependencyObject root, int depth)
{
int count = VisualTreeHelper.GetChildrenCount(root);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(root, i);
yield return child;
if (depth > 0)
{
foreach (var descendent in Descendents(child, --depth))
yield return descendent;
}
}
}
public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
{
return Descendents(root, Int32.MaxValue);
}
public static IEnumerable<DependencyObject> Ancestors(this DependencyObject root)
{
DependencyObject current = VisualTreeHelper.GetParent(root);
while (current != null)
{
yield return current;
current = VisualTreeHelper.GetParent(current);
}
}
}
有了这个可用ListBox
(和所有其他UIElements)获得几个新的扩展方法Descendents
和Ancestors
。我们可以将这些与Linq结合起来寻找东西。在这种情况下,您可以使用: -
ScrollViewer sv = SomeListBox.Descendents().OfType<ScrollViewer>().FirstOrDefault();
谢谢亲切!我甚至没有意识到控制系统的化妆可以通过这种方式进行导航。 – 2010-12-22 20:08:50
所以你怎么知道什么时候使用这些信息?如何知道它是从墓碑恢复而不是跳过一堆箍? – Roger 2011-06-12 23:01:28
@Roger:已阅读此MSDN主题:http://msdn.microsoft.com/en-us/library/ff967548(v=VS.92).aspx – AnthonyWJones 2011-06-13 12:12:27