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…


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

在Windows 8.1 store 应用中使用Behavior

Behavior一直是广大Windows store应用开发者翘首以盼的一个功能。在理想的情况下,开发人员负责开发提供功能的Behavior库,设计人员就可以通过在XAML中选择相应的Behavior来完成需要的功能,这大大降低了UI代码和应用逻辑代码之间的耦合度。可是在Windows 8 store应用开发中却没有提供对Behavior的支持。虽然说有开发者采用附加依赖属性(Attached dependency property)给出了实现办法,例如Joost van Schaik的winrtbehaviors,但这毕竟不是一个正式的解决方案。幸运的是,最新发布的Blend for Visual Studio 2013 已经提供了为Windows 8.1 Store应用开发添加Behavior的功能,现在我们既可以方便的使用内置的behavior,也可以为您的应用添加自定义的behavior了。本文主要就Blend for Visual Studio 2013中内置Behavior和Action作一个简单的介绍。 所谓Behavior,就是用于附加在某个控件上的行为。既然是行为么,通常就有时间(什么时候触发),地点(在什么对象上触发),事件(有什么功能)。所以设定一个Behavior也无外乎确定这几个方面。 根据触发的时机不同,Blend for Visual studio 2013提供了三种不同的Behavior: EventTriggerBehavior:使用事件(event)来触发行为 DataTriggerBehavior:使用数据变化来触发行为 IncrementalUpdateBehavior:当GridView,ListView控件增量更新时触发的行为。增量更新是这两个控件在Windows 8.1中的新特性。 由于IncrementalUpdateBehavior比较特殊,需要联系到增量更新的功能来讲,我会在下一篇文章中介绍。本文中我们只讨论EventTriggerBehavior和DataTriggerBehavior的用法。 Action指的是某个特定的功能,通常需要和Behavior配合起来使用。Blend for Visual Studio 2013提供了七种不同的Action: CallMethodAction:调用某个特定的函数 ChangePropertyAction:改变某个属性的值 ControlStoryboardAction:控制动画的Storyboard GoToStateAction: 使控件进入某个状态 InvokeCommandAction:触发调用Command NavigateToPageAction: 导航到某个页面 PlaySoundAction:播放声音 以上这些Behavior和Action基本上涵盖了大多数使用Behavior的场合。当然如果上述Behavior和Action还不能满足你的要求,你也可以通过IBehavior接口和IAction接口来实现自己的Behavior和Action。 首先,让我们来看一下EventTriggerBehavior。EventTriggerBehavior在Blend中是缺省的Behavior,也就是说,当你在Blend中拖一个Action到控件上的时候,Blend会自动为这个Action加上一个EventTriggerBehavior。要使用这个EventTriggerBehavior,你需要设置三个属性:EventName, SourceObject和Actions。 EventName用来设定触发该Behavior的事件,你可以选择SourceObject中指定对象支持的任一事件。 SourceObject用来选择触发该事件的源对象。 Actions是个集合,用来设置当该事件发生时需要执行的Action,因为这是一个集合,所以对每个Behavior都可以设置一组动作。 DataTriggerBehavior与EventTriggerBehavior的区别在于触发方式的不同。DataTriggerBehavior通过属性值的变化来触发动作。所以,它除了有Actions属性以外,还有三个用于设置触发方式的属性: Binding用于设定需要比较的属性,这个属性需要实现INotifyPropertyChanged接口。 ComparationCondition用于设定比较条件 Value用于设定比较的值 无论是DataTriggerBehavior还是DataTriggerBehavior都需要设置Actions. Blend中内置了七种不同的Action,…

2