在Windows Phone 7中恢复列表框的确切滚动位置

时间:2010-12-17 23:04:47

标签: silverlight windows-phone-7 listbox

我正在努力让一个应用程序很好地从墓碑中恢复过来。该应用程序包含大型列表框,所以我最好滚动回到用户在这些列表框中滚动时的位置。

很容易跳回到特定的SelectedItem - 不幸的是,对我来说,我的应用程序从不需要用户实际选择项目,他们只是滚动它们。我真正想要的是某种MyListbox.ScrollPositionY,但它似乎不存在。

有什么想法吗?

克里斯

1 个答案:

答案 0 :(得分:10)

您需要在内部抓住ScrollViewer使用的ListBox,以便获取VerticalOffset属性的值并随后调用SetVerticalOffset方法

这要求您从ListBox向下到构成其内部的Visual树。

我使用这个方便的扩展类,你应该添加到你的项目中(我必须把它放在博客上,因为我不断重复它): -

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)就可以获得一些新的扩展方法DescendentsAncestors。我们可以将这些与Linq结合起来搜索内容。在这种情况下,您可以使用: -

ScrollViewer sv = SomeListBox.Descendents().OfType<ScrollViewer>().FirstOrDefault();