WP7 Toolkit Update Removed GetItemsInView() from the LongListSelector

后端 未结 3 902
粉色の甜心
粉色の甜心 2021-01-12 19:29

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

3条回答
  •  Happy的楠姐
    2021-01-12 20:05

    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;
        }
    

提交回复
热议问题