博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows Phone 8.1 列表控件(3):多数据呈现
阅读量:6845 次
发布时间:2019-06-26

本文共 3187 字,大约阅读时间需要 10 分钟。

说到 List 控件,Windows Phone 8.1 上推荐使用的是 ListView 和 GridView。

而这两个控件实在太多东西可讲了,于是分成三篇来讲:

(3)多数据呈现

ListView 和 GridView 的最大差别就是:ListView 是一条条依序排列的,而 GridView 则是一块块依序排列的,因此 ListView 中的一项就会占据整整一行或者一列,而 GridView 的一项只会占据它应有的大小,一行或一列中可以放置多项。

而两者在其它方面上基本一致,因此下文只对 ListView 进行介绍,GridView 其实也一样的。

 


 

多数据呈现,也就是说大量的数据要在 ListView 中呈现时,加载必定会较慢,那要如何让用户体验更好呢?

(1)添加 ListView 的 ContainerContentChanging 事件

如字面意思所示,也就是当 ListView 的内容(也就是Item)发生改变时会触发的事件:

(2)确定 Item 内容的呈现顺序

比如 Item 的结构为:

Grid   |__Border name=templatePlaceholder    |__Image name=templateImage   |__Grid      |__TextBlock name=templateTitle      |__TextBlock name=templateSubTitle

一般的做法都是先让占位符(templatePlaceholder)呈现,然后根据每项内容的重要程度和加载难度依次排序呈现。

假设这个 Item 的呈现顺序为:Placeholder -> Title -> Image, SubTitle。

(3)处理 ListView 的 ContainerContentChanging 事件

private void IncrementalUpdateHandler(ListViewBase sender, ContainerContentChangingEventArgs args){    args.Handled = true;if( args.Phase != 0 )        throw new Exception("something went terribly wrong");    else    {        Grid templateRoot = (Grid)args.ItemContainer.ContentTemplateRoot;        Border placeholder = (Border)templateRoot.FindName("templatePlaceholder");        Image itemImage = (Image)templateRoot.FindName("templateImage");        TextBlock title = (TextBlock)templateRoot.FindName("templateTitle");        TextBlock subtitle = (TextBlock)templateRoot.FindName("templateSubTitle");        placeholder.Opacity = 1;        itemImage.Opacity = 0;        title.Opacity = 0;        subtitle.Opacity = 0;        args.RegisterUpdateCallback(ShowText);    }}

首先将 args.Handled 设为 true 以及检查 args.Phase 是否不为 0。

然后根据控件名称找到各控件,并根据需要设置每个控件的 Opacity,隐藏或显示它们。(注意,不能调整 Visible 属性,因为这会再次触发 ContainerContentChanging 事件)

最后调用 args.RegisterUpdateCallback(MethodName),显示下一个要呈现的控件内容。

private void ShowText(ListViewBase sender, ContainerContentChangingEventArgs args){    args.Handled = true;    if( args.Phase != 1 )        throw new Exception("something went terribly wrong");    else    {        SampleItem sItem = (SampleItem)args.Item;        Grid templateRoot = (Grid)args.ItemContainer.ContentTemplateRoot;        TextBlock title = (TextBlock)templateRoot.FindName("templateTitle");        title.Text = sItem.Title;        title.Opacity = 1;        args.RegisterUpdateCallback(ShowImage);    }}
ShowText
private void ShowImage(ListViewBase sender, ContainerContentChangingEventArgs args){    args.Handled = true;    if( args.Phase != 2 )        throw new Exception("something went terribly wrong");    else    {        SampleItem sItem = (SampleItem)args.Item;        Grid templateRoot = (Grid)args.ItemContainer.ContentTemplateRoot;        Image itemImage = (Image)templateRoot.FindName("templateImage");        TextBlock subtitle = (TextBlock)templateRoot.FindName("templateSubTitle");        Border placeholder = (Border)templateRoot.FindName("templatePlaceholder");        itemImage.Source = new BitmapImage(new Uri(sItem.ItemImage));        subtitle.Text = sItem.TargetGroup;        itemImage.Opacity = 1;        subtitle.Opacity = 1;        placeholder.Opacity = 0;    }}
ShowImage

其实也就是根据第二步中确定的内容呈现顺序依次调用 RegisterUpdateCallback。

转载于:https://www.cnblogs.com/xiaoshi3003/p/3748827.html

你可能感兴趣的文章
微信开发,网页扫码登录和公众号授权登录
查看>>
网站安全狗IIS版 V4.0.15586 发布
查看>>
Docker存储驱动之AUFS简介
查看>>
Java中如何封装自己的类,建立并使用自己的类库?
查看>>
Java Http请求工具类
查看>>
iscsi集群搭建
查看>>
Flutter Web - 目标全平台开发的Flutter再下一城!
查看>>
Nginx代理Tomcat
查看>>
Apache与Tomcat的区别
查看>>
mysql—Access denied for user 'root'@'localhost' (using password:NO)
查看>>
hibernate 懒加载异常
查看>>
python3的zip函数
查看>>
cp命令
查看>>
Paxos算法详细图解
查看>>
如何用Exchange Server 2003 构建多域名邮件系统
查看>>
configparser.ConfigParser.writer()
查看>>
httpd服务如何开机启动
查看>>
JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载
查看>>
Linux学习笔记之bash
查看>>
android 1.6中LinearLayout getBaseline函数的一个bug
查看>>