Incremental update item data for ListViewBase controls in windows 8.1

Generally Listview and Gridview which based on ListViewBase class should process a large amount of data items. It may heavily impact the performance if we can’t handle it properly. We can utilize UI virtualization to solve parts of memory and performance issues. But we will still encounter the problem that the data items can’t be…

0

Windows 8.1下ListView和GridView的数据分步显示

通常基于ListViewBase类的ListView和GridView需要处理大量的数据项(date Item),如果处理不好的话,会对应用的性能产生严重影响。虽然UI virtualization帮助解决了显示大量Item时内存占用过多及初始化时间过长的问题,在用户进行平移操作的时候,如果每一个Item的内容比较复杂,仍然会出现Item加载过慢的问题,就好像幻灯片一样,每个Item一个一个的显示出来,使应用的流畅度大打折扣。为了进一步提高用户体验,Windows 8.1下为这两个控件的显示效果作了优化,主要表现在两个方面: 为基于ListViewBase类的控件的每个Item都添加了占位符,也就是说,当显示Item的时候,在数据没有加载完成之前,系统首先为每个Item都自动显示一个缺省的图标。您可以使用ShowsScrollingPlaceholders属性来启用或禁止这项功能。  为基于ListViewBase类的控件添加了一个新的事件(Event):ContainerContentChanging。这个Event会在加载的内容被改变的时候触发。您可以在这个Event的事件处理函数中加入代码来优化对Item的显示。 第一种方法的实现很简单,这里就不多说了,这里我就第二种方法做进一步的介绍。 ContainerContentChanging会在每一个Item被加载的时候触发,这时候你可以选择分步加载Item中的内容。比如说,我的GridView中有三个加载项: <DataTemplate x:Key=”ItemDataTemplate”>     <Grid>      <Grid.RowDefinitions           <RowDefinition Height=”*”/>           <RowDefinition Height=”160″/>           <RowDefinition Height=”*”/>       </Grid.RowDefinitions>       <TextBlock x:Name=”tbkName” Text=”{Binding Name}” />       <Image x:Name=”imgPhoto” Source=”{Binding ImageUri}” Grid.Row=”1″ />        <TextBlock x:Name=”tbkTakenTime” Text=”{Binding TakenTime}”Grid.Row=”2″/>     </Grid> </DataTemplate> 那么我们可以设定第一步先加载Name,第二步再加载TakenTime,最后一步才加载Photo。如果ShowsScrollingPlaceholders设为True的话,那么实际上在第一步之前系统会自动为每个Item加上一个灰色的占位符。如果你觉得这个占位符不好看,你也可以选择将这个属性设为False,然后手动的在ContainerContentChanging的第一步中加入占位符。那么这时候加载项就变为四个: <Image x:Name=”imgPlaceholder” Grid.RowSpan=”3″ Source=”ms-appx:///Placeholder.jpg” /> <TextBlock x:Name=”tbkName” Text=”{Binding Name}”…

4