Windows Phone 7 ListBox 列表项渐显加载动画学习笔记
在wp7程序中,当程序功能越来越复杂时,性能问题是我们不得不考虑的一个问题。在聊天列表中,如果聊天项过多,而且项目UI组件足够复杂时,
我们不得不想尽办法让UI尽快加载。所以有一种可行的方案,就是像QQ聊天列表一样,从上至下,列表项逐一加载(加载完第一项,再加载第二项,再加载第三项,给用户尽快的UI响应,也不至于等待到显示所有的列表项。
在我们的例子中,我还给每个列表项显示的过程中加入了渐显动画,这样当列表项足够复杂时,也能表现出比较好的展示效果。
实现的基本原理:
实现的原理也不难,主要的思路是:
1.列表项原本只是一个简单的自定义ContentControl(Codewp7ItemContainer),等到合适的时机再加载他的content(Codewp7ListBoxItem);
2.使用一个管理类LoadService,对UI列表项的加载进行控制,当加载了一项后,再进行第二项的加载,再进行第三项的加载....。
3.给每一个实际的列表项的显示加入渐显动画。
开始看我们的实现吧:
ListItemObject: 列表的实际数据
public class ListItemObject { public string Title; public string Info; }
LoadService的队列控制实现
RoutedEventHandler itemLoaded;
List<UILoadAction>
LoadItems = new List<UILoadAction>();
object LoadArrayLock = new
object();
//当UILoad队列中 全部UI load成功,会回调这个函数
public event RoutedEventHandler LoadedComplete;
public void
PushLoadAction(UILoadAction loadAction)
{
if (loadAction == null)
return;
lock (LoadArrayLock)
{
LoadItems.Add(loadAction);
}
if (LoadItems.Count <= 1)
{
PopLoadAction();
}
}
private void PopLoadAction()
{
if (LoadItems.Count <= 0)
{
// Log.d(TAG,
"LoadedComplete!");
if (LoadedComplete !=
null)
{
LoadedComplete(null,
null);
}
return;
}
mEle.Dispatcher.BeginInvoke(() =>
{
lock (LoadArrayLock)
{
UILoadAction action;
if (LoadItems.Count
<= 0)
{
// Log.d(TAG, "LoadedComplete in
BeginInvoke!");
if
(LoadedComplete != null)
{
LoadedComplete(null, null);
}
return;
}
// Log.d(TAG,
"LoadAction Array size:"+LoadItems.Count);
action =
LoadItems[0];
action(item_Loaded);
// Log.d(TAG,
"pop");
LoadItems.RemoveAt(0);
}
});
}
void item_Loaded(object sender,
RoutedEventArgs e)
{
PopLoadAction();
}
对于每一项加入渐显动画
private Storyboard getLoadStoryBoard()
{
Storyboard ret;
// Prepare for scale
animation
double from = 0;
double to = 1;
TimeSpan timespan =
TimeSpan.FromSeconds(0.8);
IEasingFunction
easingFunction = new ExponentialEase { EasingMode = EasingMode.EaseInOut };
ret = new Storyboard();
DoubleAnimation
animationOpacity = new DoubleAnimation { From = from, To = to, Duration =
timespan, EasingFunction = easingFunction };
Storyboard.SetTarget(animationOpacity, this);
Storyboard.SetTargetProperty(animationOpacity,
new PropertyPath(UIElement.OpacityProperty));
ret.Children.Add(animationOpacity);
return ret;
}
这也是我在IT在线教育平台麦子学院学习时做的一篇笔记,这里整理一下,希望能抛砖引玉。
Windows Phone 7 ListBox 列表项渐显加载动画学习笔记的更多相关文章
- 【转】未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。
“/xxxxx”应用程序中的服务器错误. ------------------------------------------------------------------------------- ...
- 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互
[源码下载] 背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互 作者: ...
- 【转发】未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。
http://www.cnblogs.com/joey0210/archive/2012/09/29/2708420.html 上一篇文章说到了DLL引用问题,主要是说的程序中如果使用过了反射, ...
- 微信小程序开发——列表分页上拉加载封装实现(订单列表为例,订单状态改变后刷新列表滚动位置不变)
业务需求: 业务需求是给订单列表添加分页功能,也就是上拉加载这种每次只请求加载固定数量的数据. 需求分析: 对业务来说就是简单的分页上拉加载,但是对于技术实现来说,除了要处理分页数据的累加加载,还要处 ...
- 引用64位dll时候出现 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。试图加载格式不正确的程序。
引用64位dll时候出现 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序. 需要在web.config增加配置 <startup use ...
- System.BadImageFormatException : 未能加载文件或程序集“Medici.PaymentRecover, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。
System.BadImageFormatException : 未能加载文件或程序集“xxxxx.xxxxx, Version=1.0.0.0, Culture=neutral, PublicKey ...
- 重新想象 Windows 8 Store Apps (54) - 绑定: 增量方式加载数据
[源码下载] 重新想象 Windows 8 Store Apps (54) - 绑定: 增量方式加载数据 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 绑定 通过实 ...
- 未能加载文件或程序集“XXXXX”或它的某一个依赖项。试图加载格式不正确的程序。
未能加载文件或程序集“FastColoredTextBox, Version=2.10.5.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项.试图加载 ...
- 能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。试图加载格式不正确的程序。
现象: 能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序.
随机推荐
- css笔记 css用法:
前端框架:AdminLTE https://almsaeedstudio.com/themes/AdminLTE/index2.html CSS学习教程: http://www.divcss5.co ...
- nie题目-游戏排行榜设计
一个mmorpg游戏,玩家众多,需要对玩家战斗力进行排行,并且战斗力变化时需要及时刷新.需要设计一个这样的排行榜. 关于海量数据排行榜的做法,云风在他的博客里给过思路,谈谈陌陌争霸在数据库方面踩过的坑 ...
- Python练习题 025:判断回文数
[Python练习题 025] 一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. ---------------------------------------- ...
- [Java] log4j异常输出到日志
当程序运行异常时,e.printStackTrace()会打印出异常.但是很多时候我们希望将这些异常输出到日志中,以便日后可以随时查看到,可以通过这些异常快速的找到程序发生异常的代码. 那么有办法可以 ...
- MVC+jquery+AJAX的几种方式
// 传过去一个简单值,获取一个简单值 $.ajax({ type: "GET", url: '<%= Url.Action("xx", "Co ...
- TCP/IP协议原理与应用笔记27:网际协议(IP)之 选项(Options)
1. 选项(Options) (1)作用:网络测试或者调试,可选 (2)格式:0~40 bytes 2. 选项类型:
- ArcGIS 投影转换(AE)
private void btnOK_Click(object sender, EventArgs e) { try { CheckError(); this.checkEdit1.Enabled = ...
- ASP.NET FormsAuthentication跨站点登录时绝对地址返回的问题
关键字:FormsAuthentication, loginUrl, ReturnUrl, AbsoluteUri 在ASP.NET应用程序中,FormsAuthentication几乎是标配,但Fo ...
- 利用dex2jar反编译apk
下载工具dex2jar和jd-gui ,解压 将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额classes.dex文件(它就是java文件编译再通过dx工具打包而成的) 将获 ...
- mac jdk设置
mac系统一般默认会安装jdk 1.6,路径为/System/Library/Java/JavaVirtualMachines/1.6.0.jdk,此Jdk为系统默认jdk; 但某些框架/应用要求jd ...