Восстановление точной позиции прокрутки списка в 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();