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在线教育平台麦子学院学习时做的一篇笔记,这里整理一下,希望能抛砖引玉。

时间: 2024-08-28 07:31:44

Windows Phone 7 ListBox 列表项渐显加载动画学习笔记的相关文章

如何让 WPF 中 ListBox 列表项前自动加上序号

有时候我们可以希望在 ListBox 列表项前面加上序号,这样看起来更清楚,还可以配合使用快捷键等. 希望达到如下图的效果: 显然我们可以通过修改 ListBox 的模板来实现,只要在 Item 中加上数字这一项即可,利用 MultiBinding 和 IMultiValueConverter 即可实现. 示例 首先,我们创建一个 Person 类: public class Person { public string Name { get; set; } } 然后创建一个 Converter

背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(WebView) 加载指定 HttpMethod 的请求 自定义请求的 http header app 与 js 的交互 示例1.演示 WebView 如何加载指定 HttpMethod 的请求以及如何自定义请求的 http headerWebApi/Controllers/WebViewPostController.cs /* * 用于 WebView 演示“如何加载指定 HttpMethod 的请求,以及如何自

【转】未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。

"/xxxxx"应用程序中的服务器错误. -------------------------------------------------------------------------------- 未能加载文件或程序集"xxx"或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.BadImageFormatE

未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。

上一篇文章说到了DLL引用问题,主要是说的程序中如果使用过了反射,则反射创建对象的dll必须放在web应用程序的bin目录里.今天又遇到了一个类似的问题,mvc3的应用程序,发布到iis上时,报:”未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项.试图加载格式不正确的程序.“.原因很简单,因为我发的时候,我项目中的oracle提供的asp.net访问oralcle数据库的这个 Oracle.DataAccess.dll的本地复制没有设置为true(在项目引用里找到该引

引用64位dll时候出现 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。试图加载格式不正确的程序。

引用64位dll时候出现 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序. 需要在web.config增加配置 <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup>

WP8_GestureListener实现列表向下滑动加载新数据

利用GestureListener的OnDragCompleted事件,实现列表向下滑动时,加载新的数据: (不建议使用 Touch.FrameReported+=Touch_FrameReported; 此事件是全局的,如果没有注销事件,在离开页面后仍会得到响应,而这不是希望的效果) 前台代码: <Border> <!- 此处放置ScrollViewer或 ListBox--> <ScrollViewer/>   <toolkit:GestureService.

.NET 未能加载文件或程序集&ldquo;xxx&rdquo;或它的某一个依赖项。试图加载格式不正确的程序。

症状: 未能加载文件或程序集"xxx"或它的某一个依赖项.试图加载格式不正确的程序.说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息.异常详细信息: System.BadImageFormatException: 未能加载文件或程序集"xxx"或它的某一个依赖项.试图加载格式不正确的程序.源错误:执行当前 Web 请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发

“System.BadImageFormatException”类型的未经处理的异常在 PurchaseDevices.Access.dll 中发生 其他信息: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确

引用sqlite的程序集时,有时会报如下异常: "System.BadImageFormatException"类型的未经处理的异常在 PurchaseDevices.Access.dll 中发生 其他信息: 未能加载文件或程序集"System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"或它的某一个依赖项.试图加载格式不正确的程序. 解决方案:在配置

未能加载文件或程序集“Common”或它的某一个依赖项。试图加载格式不正确的程序

原因:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题解决方案一:如果是64位机器,IIS--应用程序池--高级设置--启用32位应用程序 :true.解决方案二:修改项目属性--生成--目标平台(比如,X86\X64)未能加载文件或程序集"Common"或它的某一个依赖项.试图加载格式不正确的程序