Восстановление точной позиции прокрутки списка в Windows Phone 7 - PullRequest
8 голосов
/ 18 декабря 2010

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

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

Есть идеи?

Крис

1 Ответ

10 голосов
/ 18 декабря 2010

Вам нужно овладеть 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...