With the latest update to the Windows Phone Toolkit they have overhauled the internals of the LongListSelector for the Mango release. One of the changes was removing suppor
The LongListSelector
is using a ScrollViewer
internally (apparently since the Aug 2011 release). This fact can be used to restore the position of the list after tombstoning by following the example given at http://damianblog.com/2011/01/21/wp7-scroll-pivot/ for the pivot controller.
In OnNavigatedFrom()
remember the scroll offset:
private bool _newPageInstance = true;
private double _scollOffset = double.NaN;
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
var scrollViewer = FindScrollViewer(LongList);
State["scrollViewer.VerticalOffset"] = scrollViewer.VerticalOffset;
State["PreservingPageState"] = true;
_newPageInstance = false;
}
private static ScrollViewer FindScrollViewer(DependencyObject parent)
{
var childCount = VisualTreeHelper.GetChildrenCount(parent);
for (var i = 0; i < childCount; i++)
{
var elt = VisualTreeHelper.GetChild(parent, i);
if (elt is ScrollViewer) return (ScrollViewer)elt;
var result = FindScrollViewer(elt);
if (result != null) return result;
}
return null;
}
And restore it in OnNavigatedTo()
if the app have been tombstoned:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (!_newPageInstance || !State.ContainsKey("PreservingPageState"))
{
return;
}
_scollOffset = (double)State["scrollViewer.VerticalOffset"];
}
private void LongList_Loaded(object sender, RoutedEventArgs e)
{
if (double.IsNaN(_scollOffset)) return;
var longListSelector = (LongListSelector)sender;
var scrollViewer = FindScrollViewer(longListSelector);
scrollViewer.ScrollToVerticalOffset(_scollOffset);
_scollOffset = double.NaN;
}