通过获取Viewport滚动LongListSelector的垂直偏移量-can';t向SetViewportOr

本文关键字:-can SetViewportOr 偏移量 垂直 获取 Viewport 滚动 LongListSelector | 更新日期: 2023-09-27 18:26:16

最后,我得到了ViewportControl,我一直在寻找LongListSelector,但当我尝试使用以下方法滚动到特定的偏移量时,我无法滚动到偏移量。我使用一个公共静态类GlobalVars(全局变量)在页面之间传递数据。

因此,当用户从LongListSelector->Navigates to ItemDetail Page中选择item时,如下所示:

 private void llsArtists_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        GetFirstVisibleItem(llsArtists);
        var artist = (Artist)e.AddedItems[0];
        GlobalVars._artistName = artist.ArtistName;
        GetSelectedArtist(artist.ArtistName);
        NavigationService.Navigate(new Uri("/ArtistDetail.xaml", UriKind.Relative));
    }

然后通过点击Back键返回到同一页面,我希望用户与最后一个项目在同一个项目上(目前它跳到第一个索引。)因此,我得到Viewport和垂直偏移:

        private void GetFirstVisibleItem(LongListSelector lls)
    {     
        var offset = FindViewport(lls).Viewport.Top;
        GlobalVars._artistScrollOffset = offset;
    }

   private static ViewportControl FindViewport(DependencyObject parent)
    {
        var childCount = VisualTreeHelper.GetChildrenCount(parent);
        for (var i = 0; i < childCount; i++)
        {
            var elt = VisualTreeHelper.GetChild(parent, i);
            if (elt is ViewportControl)
                return (ViewportControl)elt;
            var result = FindViewport(elt);
            if (result != null) 
                return result;
        }
        return null;
    }

最后滚动到偏移

        void ScrollToOffset()
    {
        Point loc = new Point();
        loc.X = 0;
        //loc.Y = Math.Round(GlobalVars._artistScrollOffset, 2);
        loc.Y = GlobalVars._artistScrollOffset;
        FindViewport(llsArtists).SetViewportOrigin(loc);
    }

问题是-如果我像设置loc.X = 0一样显式设置Point loc的Y值,它就可以正常工作!LongListSelector运行完美!但是,如果我希望它是一个变量,这正是我希望的——它就是不起作用!我觉得这很奇怪?是什么原因造成的?任何帮助都将不胜感激!

通过获取Viewport滚动LongListSelector的垂直偏移量-can';t向SetViewportOr

我觉得你对这个问题想得太多了。你不需要做任何事情,它应该返回到它停止的页面的确切位置。

我唯一能想到的是,当您NavigateTo或NavigateFrom时,您正在"更改"/"重置"DataContextItemsSource。另一种可能性是在PhoneApplicationPage_Loaded事件上设置LongListSelector DataContent/ItemsSource。

如果你做了最后一个,它会重置列表。

要么在构造函数中设置ItemsSource,要么将PhoneApplicationPage_Loaded更改为以下内容:

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
    if(myLongListSelector.ItemsSource == null)
    {
        // myLongListSelector.ItemsSource = YOUR_DATASOURCE;
    }        
}

这样,它只会设置一次,所以返回页面不会重新分配它。