浅谈ListBox在Windows Phone 7 中的使用
在windows phone 7 tips (5) 中曾经提到,在windows phone 7 中页面的布局一般分为:panoramic、pivot、list和full screen。而通常list的实现方式就是listbox。
一、什么是listbox?
listbox 是一个显示项集合的控件。一次可以显示 listbox 中的多个项。
listbox继承自itemscontrol,可以使用items或者itemssource设置其内容。
二、在listbox中显示数据
我们可以通过两种方式在listbox中显示:直接内嵌listboxitem(或其他uielement,如textblock等) 与数据绑定(90%情况下均为数据绑定实现)。
1.直接内嵌listbox示例代码如下:
2.数据绑定的示例代码如下:
xaml代码 :
后置代码:
最终的现实效果都是一样的,如下图:
三、 如果获取listbox的itemtemplate/datatemplate 中指定的控件
当我们使用数据绑定的控件,比如说listbox,我们通常会自定义listbox的模板(一般建议使用blend工具修改模板),而在某些情况下,我们需要获取datatemplate中的某一控件,以对其做一些特定的操作。那我们如何获取呢?事实上,我们可以使用aspx">visualtreehelper 类来获取指定的控件。下面是具体的demo:
前台xaml代码:
后置代码代码:
四、listbox 性能相关
在silverlight中,为了将数据显示给用户,我们需要加载数据和绑定数据,但是哪个会导致性能问题呢?答案是:根据你的数据类型以及界面(ui)的复杂性而定。
通常,加载数据可以在ui线程或者后台线程中实现,数据存在的形式也不经相同,有的序列化为二进制数据,有的序列化为xml文件,有的则是图片形式存在等等。而数据绑定又有三种不同的绑定形式:一次绑定(one time)、单向绑定(one way)和双向绑定(two way)。
这里简单介绍下什么是vsp(virtualizingstackpanel)
msdn解释为:将内容排列和虚拟化在一行上,方向为水平或垂直。“虚拟化”是指一种技术,通过该技术,可根据屏幕上所显示的项来从大量数据项中生成user interface (ui) 元素的子集。仅当 stackpanel 中包含的项控件创建自己的项容器时,才会在该面板中发生虚拟化。 可以使用数据绑定来确保发生这一过程。 如果创建项容器并将其添加到项控件中,则与 stackpanel 相比,virtualizingstackpanel 不能提供任何性能优势。
virtualizingstackpanel 是 listbox 元素的默认项宿主。 默认情况下,isvirtualizing 属性设置为 true。当 isvirtualizing 设置为 false 时,virtualizingstackpanel 的行为与普通 stackpanel 一样。
我们可以将vsp理解为当需要时,vsp会生成容器对象,而当对象不在可视范围内时,vsp就把这些对象从内存中移除。当listbox很想当大数据量的项目时,我们不需要将不在可视范围中的对象加载到内存中,从而解决了内存的问题。另外vsp有一个属性cachemode设置缓存表示形式,默认设为standard。当我们需要循环显示,可以将其设置为recycling。
在listbox中使用vsp来进行数据虚拟化时,我们需要注意以下几点:
1. 确保在datatemplate 中的容器(如grid)大小固定
2. 在数据对象可以提供相应值时,尽量避免使用复杂的转换器(converter)
3. 不要在listbox中内嵌listbox
4. 强烈推荐不要在datatemplate中使用用户控件
5. 在datatemplate中不要使用自定义控件
以上是对listbox的一个简单介绍
推荐阅读
-
Windows Phone 开发中重力感应的简单使用示例
-
在Windows7中的DPI与主题的问题
-
在Windows Phone 7 中显示HTML代码
-
提升迅雷在Windows7中的下载速度
-
浅谈箭头函数写法在ReactJs中的使用
-
Windows Phone中Silverlight Toolkit的使用
-
Windows Phone 7 开发探索笔记4——触控操作之XNA中的Gesture
-
Windows Phone 7中带题头的TextBox和PasswordBox
-
在 Azure 中的 Windows 虚拟机上使用 SSL 证书保护 IIS Web 服务器
-
Windows Phone 7 开发之Microsoft.Phone.Tasks中的各项Task