通过获取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运行完美!但是,如果我希望它是一个变量,这正是我希望的——它就是不起作用!我觉得这很奇怪?是什么原因造成的?任何帮助都将不胜感激!
我觉得你对这个问题想得太多了。你不需要做任何事情,它应该返回到它停止的页面的确切位置。
我唯一能想到的是,当您NavigateTo或NavigateFrom时,您正在"更改"/"重置"DataContext
或ItemsSource
。另一种可能性是在PhoneApplicationPage_Loaded
事件上设置LongListSelector DataContent/ItemsSource。
如果你做了最后一个,它会重置列表。
要么在构造函数中设置ItemsSource,要么将PhoneApplicationPage_Loaded
更改为以下内容:
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
if(myLongListSelector.ItemsSource == null)
{
// myLongListSelector.ItemsSource = YOUR_DATASOURCE;
}
}
这样,它只会设置一次,所以返回页面不会重新分配它。