通过滚动其垂直一个LongListSelector通过获取其视偏移 - 不能添加动态值SetView

2019-09-26 05:44发布

所以最后,我感到我已经从这么长时间寻找LongListSelector的ViewportControl但是当我试图滚动到一个特定的使用下面的方法偏移,我不能滚动到偏移。 我使用的是公共静态类GlobalVars (全局变量)来传递页面之间的数据。

因此,当用户选择一个item从LongListSelector - >导航到ItemDetail页由这样的:

 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键,我想用户在同一个项目的最后一个。因此,我得到的视口和垂直偏移(目前跳到第一个索引。):

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

最后ScrollToOffset

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

问题是-如果我明确设置Y值的Point禄像我设置loc.X = 0 ,它只是正常工作! 该LongListSelector完美的作品! 但是,如果我想它是一个变量,这正是我想它是 - 它只是不工作! 我觉得这很奇怪吗? 可能是什么造成的? 任何帮助,将不胜感激!

Answer 1:

我认为你是在想这一个不少。 你不应该需要做任何事情,它应该返回到回离开的地方的确切位置的页面。

我能想到的唯一的事情是,你“变” /“重置”DataContextItemsSource ,当你的NavigateTo或NavigateFrom。 另一种可能性是,你设置的LongListSelector DataContent /的ItemsSource上PhoneApplicationPage_Loaded事件。

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

无论是设置在构造函数中的ItemsSource或改变PhoneApplicationPage_Loaded来是这样的:

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

这样只会把它曾经那么返回的页面不重新分配它。



文章来源: Scrolling a LongListSelector by its Vertical Offset by getting its Viewport - can't add a dynamic value to SetViewportOrigin()