如何正确的使用列表视图

  介绍

这篇文章给大家介绍如何正确的使用ListView,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强>一、获取,设置ListView的滚动位置

关于获取,设置ListView的滚动位置,微软已经提供了相关的例子,我在这个演示中是直接套用的。这个功能主要是通过ListViewPersistenceHelper来实现的,它提供以下两个方法:

//获取,ListView 的滚动位置   public  static  string  GetRelativeScrollPosition (ListViewBase  listViewBase, ListViewItemToKeyHandler  itemToKeyHandler)//,设置,ListView 的滚动位置   public  static  IAsyncAction  SetRelativeScrollPositionAsync (ListViewBase  listViewBase, String  relativeScrollPosition,, ListViewKeyToItemHandler  keyToItemHandler)

这两个方法中各有一个参考是委托类型,分别是ListViewItemToKeyHandler和ListViewKeyToItemHandler,它们的作用是告诉这个类如何处理列表项与关键的对应关系,好使得该类可以正确地获取或设置滚动位置。这里的关键是ListViewItem所代表的项目的一个属性(比如演示类中项的Id属性),这个属性的值在整个列表中是唯一的,而项目是在项目对象本身。在演示中它们的实现分别如下:

, private  String  ItemToKeyHandler (object 项目)   {才能   ,,Item  dataItem =, Item  as 项目;   ,,if  (dataItem ==, null), return 零;      ,,return  dataItem.Id.ToString ();   ,,}      private 才能;IAsyncOperation< object>, KeyToItemHandler (string 键)   {才能   ,,Func祝辞,taskProvider =, token =比;   ,,{   ,,,var  items =, listView.ItemsSource  as  List;   ,,,if  (items  !=, null)   ,,,{   ,,,,var  targetItem =, items.FirstOrDefault (m =祝辞,m.Id ==, int.Parse(关键));   ,,,,return  Task.FromResult((对象)targetItem);   ,,,}   ,,,   ,,,{   ,,,,return  Task.FromResult((对象)null);   ,,,}   ,,};   ,,return  AsyncInfo.Run (taskProvider);   以前,,}

实现这两个方法后,重载列表页的,> string  position =, ListViewPersistenceHelper.GetRelativeScrollPosition (ItemToKeyHandler this.listView也);   NavigationInfoHelper.SetInfo (targetItem,,位置);

继续为页面注册加载事件,在加载事件中加入以下代码来实现设置滚动位置:

, if  (navigationParameter  !=, null)   ,,{   ,,,if  (NavigationInfoHelper.IsHasInfo)   ,,,{   ,,,,await  ListViewPersistenceHelper.SetRelativeScrollPositionAsync (listView, NavigationInfoHelper.LastPosition,, KeyToItemHandler);   ,,,}   以前,,}

这里需要注意的是,设置滚动位置的方法是异步的,所以加载方法需要加上异步修饰符。而上述代码中对navigationParameter参数的判断则是为了区别:在导航时是否定位到最近浏览的位置,具体可参考演示的代码。

<强>二,获取ListView滚动位置处的项目

关于第二个需求的实现,我们首先需要明白以下三点:

<李>

ListView的模板(模板)中包括滚动视图,我们可以通过VisualTreeHelper获取到此控件;

<李>

ListView提供ContainerFromItem方法,它使们可以通过传递项获取包括此物品的容器,即ListViewItem;

<李>

UIElement提供TransformToVisual方法,可以得到某控件相对指定控件的位置转换信息;

所以我们的思路就是:得到ListView控件中的滚动视图,并遍历列表视图中所有的项目,在遍历过程中,得到每一项目的ListViewItem,并判断它的位置是否位于滚动视图的位置中。以下是获取ListView中当前所有可见项的代码:

public  static  List, GetAllVisibleItems(却;能够ListViewBase 列表视图)   {才能   ,,var  scrollViewer =, listView.GetScrollViewer ();   ,,if  (scrollViewer ==, null)   ,,{   ,,,return 零;   ,,}      ,,List ();   ,,foreach  (T  item  listView.Items拷贝)   ,,{   ,,,var  itemContainer =, listView.ContainerFromItem(项),as  FrameworkElement;   ,,,bool  isVisible =, IsVisibileToUser (itemContainer,滚动视图,,真的);   ,,,if  (isVisible)   ,,,{   ,,,,targetItems.Add(项);   ,,,}   ,,}      ,,return  targetItems;   以前,,}

如何正确的使用列表视图