Восстановление точной позиции прокрутки списка в Windows Phone 7

Я работаю над тем, чтобы приложение вернулось из-за того, что его захоронили. Приложение содержит большие списки, поэтому в идеале я хотел бы прокрутить назад туда, где находились пользователи, пока они прокручивали эти списки.

Легко перейти назад к определенному SelectedItem - к сожалению для меня, моему приложению никогда не требуется, чтобы пользователь фактически выбрал элемент, они просто прокручивают его. Что я действительно хочу, так это какой-то MyListbox.ScrollPositionY, но, похоже, его не существует.

Есть идеи?

Крис

1 ответ

Решение

Вы должны овладеть ScrollViewer который используется ListBox внутренне, чтобы вы могли получить значение VerticalOffset собственности, а затем вызвать SetVerticalOffset метод.

Это требует, чтобы вы достигли вниз от 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 (и все остальные элементы UIE в этом отношении) получает несколько новых методов расширения Descendents а также Ancestors, Мы можем объединить их с Linq для поиска вещей. В этом случае вы можете использовать:-

ScrollViewer sv = SomeListBox.Descendents().OfType<ScrollViewer>().FirstOrDefault();
Другие вопросы по тегам