当ListBox使用StackPanel作为容器时,如果数据源包含大量数据时,每一条数据都要创建可视化的Item来承载数据,创建这些容器就需要消耗很多时间和内存,另外滚动也非常慢,因为需要计算所有这些Item的大小和位置

如下图所示是ListBox在默认情况下加载10000个Gamer(只定义了Id和Name属性)对象时,IE的内存使用情况,此时滚动非常顺畅:

如果我们将ListBox的ItemsPanel修改为StackPanel会如何呢?下图是修改为StackPanel后IE的内存使用情况,此时滚动已经非常缓慢:

295264k 对 56372k,大概在5倍左右的差距,很显然ListBox默认使用的ItemsPanel不是StackPanel,而且可以很好的处理大量的数据加载,我们不用做任何的额外处理

对于这类问题目前有两种解决方案:

UI virtualization

最佳的一种解决方案,其核心思想就是延迟生成每个Item,只有这些Item滚动到可视区域时才显示这些Item,在Silverlight中UI virtualization是通过VirtualizingStackPanel来实现的,VirtualizingStackPanel计算哪些Item可见,然后只为这些可见Item创建UI元素,这样实际创建的UI元素非常少,内存消耗就少,每次滚动时,也不需要计算每个Item的大小和位置,只需要计算哪些Item可见,然后为这些Item创建UI元素就可以了,滚动就非常顺畅;VirtualizingStackPanel包含两种模式:standard and recycling,standard模式就是每次Item进入可视区域都会重新创建UI元素,而recycling模式则会重用之前已经创建好的UI元素,使用该模式内存消耗更少,滚动更平滑

Data virtualization

其核心思想是不一次性加载所有数据,只加载用户可以看到的数据,比如ListBox只加载滚到可视区域的数据,在Silverlight中实现Data virtualization主要是通过PagedCollectionView实现,PagedCollectionView提供分组、排序、过滤等许多功能,使用非常灵活、方便,其核心思想就是内部维护所有Item的集合,这个集合不会和ItemsControl进行绑定,将需要在界面中展示的那些数据包装成另外一个集合,这个集合与ItemsControl进行绑定,因为这个集合容量较小,所以实际上创建的UI元素非常少,节省内存,具体使用方法请参考MSDN,这里不再赘述

其他

WPF中ScrollViewer提供了IsDeferredScrollingEnabled属性支持Defer Scrolling,而Silverlight没有暴露这个属性不支持DeferScrolling

参考资料

http://www.silverlightshow.net/items/Virtualization-in-Silverlight-4-RC.aspx

Silverlight Virtualization Overview的更多相关文章

  1. 为WPF和Silverlight的Grid添加边框线(zz)

      Grid是WPF和Silverlight中的一个重要的布局元素,其他的布局元素还有StackPanel, Canvas, Border等等.从字面上说,Grid是一个表格的意思,它的使用也确实很方 ...

  2. Silverlight开源项目与第三方控件收集

    http://easysl.codeplex.com/ http://compositewpf.codeplex.com/ http://silverlight.codeplex.com/releas ...

  3. [MVCSharp]MVC# Overview概述

    MVC# Overview概述 Abstract: This article gives an overview of MVC# - a Model-View-Presenter framework ...

  4. WSL(Windows Subsystem for Linux)--Pico Process Overview

    [转载] Windows Subsystem for Linux -- Pico Process Overview Overview This post discusses pico processe ...

  5. Docker7之Docker overview

    Docker is an open platform for developing, shipping, and running applications. Docker enables you to ...

  6. 转载:Why using Single Root I/O Virtualization (SR-IOV) can help improve I/O performance and Reduce Costs

    Introduction While server virtualization is being widely deployed in an effort to reduce costs and o ...

  7. Photon——Feature Overview 功能概述

    Photon——Feature Overview 功能概述   Feature Overview 功能概述        Photon is a real-time socket server and ...

  8. Build System 和Test Framework overview总结

    良好的自动化系统可以帮助Dev/Tester快速发现product/test code issue. 正好上一个项目结束,上个项目在自动化系统上面做得非常好.从产品开始时半年release一次到后面每 ...

  9. 精通 WPF UI Virtualization (提升 OEA 框架中 TreeGrid 控件的性能)

    原文:精通 WPF UI Virtualization (提升 OEA 框架中 TreeGrid 控件的性能) 本篇博客主要说明如何使用 UI Virtualization(以下简称为 UIV) 来提 ...

随机推荐

  1. ASP.NET Core & Docker & Jenkins 零基础持续集成实战

    原文:ASP.NET Core & Docker & Jenkins 零基础持续集成实战 一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker ...

  2. yii2.0复选框默认选中

    <?php $model->node = array('0','2') ;?>   <? echo $form->field($model,'node')->che ...

  3. OpenCV For iOS 1:&#160;连接OpenCV 3.0

    本文的内容參考Instant OpenCV for iOS结合最新的开发平台完毕. 本系列文章採用的的开发环境为: 1)Xcode 6 2)OpenCV for iOS 3.0.0 alpha 接下来 ...

  4. redis在windows10上跑起来

    原文:redis在windows10上跑起来 今天,开始学习redis,发现大多数redis都是在Linux上面运行的,可是我想把它放到windows上面运行,经过查找资料,在GitHub上面发现了一 ...

  5. 向西项目管理工具Git一片

    前言 Git 这个词相信大家并不陌生,做开发的童鞋们每天都离不开它.当然,假设你的项目中没实用到分布式,那么,你可能从未用过 Git,当然也可能没听过.只是,这不是重点,重点是这一篇文章,我们将一起谈 ...

  6. PHP关联数组教程

    PHP 数组 关联数组 什么是数组?在使用 PHP 进行开发的过程中,或早或晚,您会需要创建许多相似的变量.无需很多相似的变量,你可以把数据作为元素存储在数组中.数组中的元素都有自己的 ID,因此可以 ...

  7. 简明Python3教程 12.问题解决

    我们已经探究了python语言的方方面面,现在我们将通过设计编写一个有用的程序将这些内容有机的结合起来. 主要目标是让大家有能力独自编写程序. 问题 我们要解决的问题是”希望编写一个程序,用于创建所有 ...

  8. 简明Python3教程 9.函数

    简介 函数是程序的可复用片段,允许你为语句块赋予名字之后在程序的任何地方运行它们任意次,这称做函数调用. 我们已经使用过一些内建函数,例如len和range等. 函数也许是任何有意义的软件中最重要的构 ...

  9. Linux性能测试 iostat命令

    Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令 来查看初步定位问题.其中iostat可以给我们提供丰富的IO状态数据.iostat 由 Red Hat ...

  10. cefsharp 与webbrowser简单对比概述

    原文:cefsharp 与webbrowser简单对比概述 有个项目需要做个简单浏览器,从网上了解到几个相关的组件有winform自带的IE内核的WebBrowser,有第三方组件谷歌内核的webki ...