今天和大家分享一些关于windows phone ui虚拟化和数据虚拟化的一些知识。

也顺便回答我上一篇【LongListSelector 控件 在 wp7 和wp8中的不同之处】里,留下的那个问题,微软为什么推荐使用longlistselector.

如果不是新人,那么对于"虚拟化"这个词应该不陌生。

"虚拟化"简单来说,就是在数据量很大的时候,我们只加载与可视区域(如手机屏幕)相应的少量数据。

我们先来看一下UI虚拟化。

一:Windows phone UI虚拟化

对于wp的ui虚拟化,其实我们并不需要花太多心思,因为系统自带且用的最多的listbox 和longlistselector。

已经是帮我们实现了虚拟化。我们只需要注意别把美好的虚拟化破坏掉就好了。

1.首先,演示一下虚拟化。

MainPageViewMode.cs

public class MainPageViewModel

{

//省略

public MainPageViewModel()

{ //我们模拟1000条商品数据

listProduct = new List<Product>(1000);

for (int i = 0; i < 1000; i++)

{

listProduct.Add(new Product { Id = i, Name = "产品-" + rnd.Next(1000, 10000).ToString(), Category = "" });

} } }

Mainpage.xaml

<DataTemplate x:Key="LBDataTemplate">

<Grid Loaded="Grid_Loaded" d:DesignWidth="411.045" d:DesignHeight="78.209">

<TextBlock HorizontalAlignment="Left" Margin="10,17,0,25" TextWrapping="Wrap" Foreground="Black"

Text="{Binding Name}" Height="36" Width="197" FontSize="30"/>

</Grid>

</DataTemplate>

<ListBox Background="AliceBlue" ItemsSource="{Binding ListProduct}" x:Name="listbox" Grid.Row="1" ItemTemplate="{StaticResource LBDataTemplate}" />

Loaded="Grid_Loaded" 此事件触发说明模板被加载。这里我们用的是ListBox控件

MainPage.cs

MainPageViewModel vm;

public MainPage()

{

InitializeComponent();

vm= new MainPageViewModel();

LayoutRoot.DataContext = vm;

}

private void Grid_Loaded(object sender, RoutedEventArgs e)

{

vm.LoadItemCounter++;//界面上item被渲染的数目

}

我们看到我们绑定的数据源有1000条数据,页面加载后item只渲染了21个。看似是有这样一个规律的 可视区域数目*2+3

随着我们滑动列表,Item也在不断被渲染。

嗯哪,这就是所谓的UI虚拟化了。

2.常见的破坏虚拟化的场景

很多时候,我们在编辑模板的时候,会破坏掉虚拟化。看下面

当我们编辑ListBox的ItemsPanel的时候,工具帮我们自动生成了下面的代码。

<ItemsPanelTemplate x:Key="ItemsPanelTemplate">

<StackPanel/>

</ItemsPanelTemplate>

这时候我们再次运行

WoW ! 这次页面一加载,ListBox就在不停地渲染Item.直至全部!

为什么会产生这种情况?

因为实现listbox的关键是默认的容器 VirtualizingStackPanel 通过工具编辑变成了StackPanel

改回VirtualizingStackPanel

<ItemsPanelTemplate x:Key="ItemsPanelTemplate">

<VirtualizingStackPanel/>

</ItemsPanelTemplate>

呼! 星星又亮了!

好,到这里们我己经掌握了,什么是UI虚拟化,如何避免常见的破坏UI虚拟化的场景。

以及如何判断我们对控件更改后,节操和虚拟化还在不在。

妈妈再也不用担心我们不小心破坏虚拟化了!

下面我们来看一下LonglistSelector

还是上面的例子。我们把<ListBox 换成 <phone:LongListSelector 去掉ItemsPanel="{StaticResource ItemsPanelTemplate}"

还是虚拟化,只不过默认生成的item数不一样了。

那么为什么微软官方推荐我们用longlistselector代替ListBox呢?

我们继续滑动。

看输出!

什么!!!还是31,没反应?!!!

是的,Longlistselector的 DataTemplate得到了复用。我们的item的datatemplate不会再渲染新的了。

打完,收功!

东西有点多,分两篇吧,下一篇是对性能提升更有用处的数据虚拟化。

附件Demo

Windows phone UI虚拟化和数据虚拟化(一)的更多相关文章

  1. Windows phone UI虚拟化和数据虚拟化(二)

    书接上回的Windows phone UI虚拟化和数据虚拟化(一)我们学习了wp的ui虚拟化.今天来和大家分享一下wp的数据虚拟化. 并同时感谢我的同事dgwutao在编写此文时给我的巨大帮助,3ks ...

  2. Silverlight 中datagrid控件-- 通过设置数据虚拟化加速显示

    定义依赖属性作为datagrid的数据源 protected static readonly DependencyProperty ViewLogsProperty = DependencyPrope ...

  3. 基于windows server 2012 的微软桌面虚拟化实战教程

    http://abool.blog.51cto.com/8355508/1587489/ Windows Server2012 中的“远程桌面服务”服务器角色中就提供了允许用户连接到虚拟机.Remot ...

  4. 即兴小探华为开源行业领先大数据虚拟化引擎openLooKeng

    @ 目录 概述 定义 背景 特点 架构 关键技术 应用场景 安装 单台部署 集群部署 命令行接口 连接器 MySQL连接器 ClickHouse连接器 概述 定义 openLooKeng 官网地址 h ...

  5. KVM 介绍(3):I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtualizaiton Para-virtualization]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  6. Windows 7开发:UAC数据重定向 - Win32 Native

    Windows 7开发:UAC数据重定向 - Win32 Native 目标 本动手实验中,您将会学习如何: • 故障排除一个文件重定向 问题 • 使用Process Monitor查找引起问题的根本 ...

  7. 用 Blend 给Windows Phone 应用创建 示例数据

    前言  创建 示例数据(Sample Data) 是提高程序开发效率的一个很有效方法,有了它,我们调UI的时候就不必每次都运行应用,然后在手机上观看页面效果了,配合 “AlignmentGrid.pn ...

  8. Docker概念学习系列之虚拟化(系统虚拟化和容器虚拟化)

    不多说,直接上干货! 虚拟化定义: 虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器.网络.内存及存储等,予以抽象.转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更 ...

  9. TortoiseGit和msysGit安装及使用笔记(windows下使用上传数据到GitHub)[转]

    TortoiseGit和msysGit安装及使用笔记(windows下使用上传数据到GitHub) Git-1.7.11-preview+GitExtensions244SetupComplete+T ...

随机推荐

  1. odoo8 报表页面修改和字体设置

    版本8.0, 想要发票修改报表页眉的内容,去公司设置下修改,返现无论如何也不生效. 放狗后得知: You probably already know that you can customise th ...

  2. ionic2 tabs 自定义图标

    ionic2 tabs 自定义图标 一.准备资源 tabs icon 的svg格式的矢量图片 二.生成字体样式文件 打开icoMoon网站去制作字体文件. 三.使用字体文件 解压下载的文件,将其中的f ...

  3. sublime前端插件以及常用快捷键

    29个常用 Sublime Text 插件推荐 来源:互联网 作者:佚名 时间:06-18 09:27:55 [大 中 小] Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,P ...

  4. 1898 ERROR nova.compute.manager

    2018-06-10 21:03:54.045 1898 ERROR nova.compute.manager [instance: 15a6c26f-b8af-4a3e-a3df-8552c16e0 ...

  5. 使用ABAP编程实现对微软Office Word文档的操作

    SAP ABAP里提供了一个标准的类CL_DOCX_DOCUMENT,提供了本地以".docx"结尾的微软Office word文档的读和写操作. 本文介绍了ABAP类CL_DOC ...

  6. 双击窗体是模拟键盘上的Tab键

    实现效果: 知识运用: SendKeys类的Send方法 //向活动应用程序发送击键 public static void Send (string keys) 实现代码: private void ...

  7. CPP-基础:String类

    已知类String的原型为: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String ...

  8. Caused by: java.lang.ClassNotFoundException: java.com.bj186.ssm.controller.UserController

    在搭建SpringMVC的时候,遇到的这个问题真的很奇葩, 找不到UserController这个类 这明明不就在工程目录下吗? 经过了一番艰苦卓绝的斗争, 才发现原来是包导少了 之前导入的包是: & ...

  9. MVC使用方法

    1.mvc打开html代码 后台处理:   ///<summary>         ///恢复html中的特殊字符         ///</summary>         ...

  10. Greenplum介绍-table

    GP中的table和其它关系型数据表是一样的,除了数据被分布在不同的segment以外. 建表时需定义以下几个方面:1. 指定列和数据类型2. 约束3. 分布策略4. 数据存储方式5. 大表分区策略 ...