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”或它的某一个依赖项.试图加载格式不正确的程序.
随机推荐
- [vba]excel中求选中数据和为给定数所有的组合
昨天下午开始学习的vba,累死了,肯定有bug,待调试 vba程序如下: Dim aSum As Integer Dim tSum As Integer ) As Integer Dim arrMax ...
- 代码片段---S3C2440按键中断驱动程序的设计
用到的知识: 中断 等待队列 睡眠 select poll misc http://pan.baidu.com/s/1bneSG5h
- CSS 之 内层div填充margin,外层div的背景色不会覆盖该margin
外层元素(如div)中只有一个非空子元素,此时margin是被折叠了.两者之间取最大的margin值,表现在外层父元素上,而不是内层子元素. 注意: (1)只有垂直方向上才会出现此现象,水平方向不会出 ...
- C语言第六节基本运算符
算术运算 C语言一共有34种运算符,包括了常见的加减乘除运算 加法运算+ 除开能做加法运算,还能表示正号:+5.+90 减法运算- 除开能做减法运算,还能表示符号:-10.-29 乘法运算* 注意符号 ...
- iOS- 自定义UIView (测试block和代理)
#import <UIKit/UIKit.h> typedef void(^compeletionHandler) (NSInteger selectButtonIndex); @clas ...
- SOA与C#
What is SOA? SOA or Service oriented architecture is an architecture style for building business app ...
- [Java] String.Split 方法的6个重载函数
String.Split 方法有6个重载函数: 程序代码 1) public string[] Split(params char[] separator) 2) public string[] Sp ...
- java中异步调用的解决方法
package demo.future; import java.util.ArrayList; import java.util.List; import java.util.concurrent. ...
- VS2012添加ADO实体数据模型
最近更新了开发工具为VS2012,在使用EntityFramework创建实体数据模型的时候,在添加选项中找不到这个选项. 确定了自己已经安装了EntityFramework,猜到估计是版本的问题,于 ...
- MVC基础(很基础很基础~~~)
最近工作比较不忙,准备学习一些东西,作为一个菜鸟,不断学习新东西(我不会的东西)充实自己真的很重要,所以整理一下基础的mvc知识,以备不时之需.呵呵~~ 首先感谢原文作者:QLeelulu的文章htt ...