这篇文章给大家介绍如何正确的使用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; 以前,,} 如何正确的使用列表视图