今天和大家分享一些关于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

转载于:https://www.cnblogs.com/beyoung/p/windows-phone-Virtualizing.html

Windows phone UI虚拟化和数据虚拟化(一)相关推荐

  1. 云世界,一切如梦幻,数据也玩虚拟化。 SQL Server 2019 新特性系列一:数据虚拟化

    SQL Server 2019 新特性系列一:数据虚拟化 最新更新 SQL Server已经到了CTP2.2版本,主要更新了如下功能: 大数据集群:在大数据群集上使用 azure 数据工作室中的 sp ...

  2. 小测试--在Windows server 2016中启用RemoteFX-GPU虚拟化功能

    这两天因为需要,部署了很多W2016DC服务器,其中有一台工作站有NVIDIA Quadro K4200显卡,就顺手简单测试了W2016的RemoteFX-GPU虚拟化功能,其过程如下,很简单,供需要 ...

  3. 《数据虚拟化:商务智能系统的数据架构与管理》一 1.11 数据集成的其他方式...

    1.11 数据集成的其他方式 使用数据虚拟化可以集成数据,但是这并不是集成来自不同数据存储中数据的唯一方式.正如1.4节所讲,存在不同的技术方法来集成数据,包括ETL.ELT和复制.本节会简要解释这些 ...

  4. 大数据虚拟化零起点-4基础运维第三步-部署vCenter Server Virtual Appliance 5.1

    在大数据虚拟化零起点基础运维第二步中,我们完成了vSphere5.1的安装.接下来,我们可以开始第三步--部署vCenterServer Virtual Appliance 5.1. 在开始部署之前, ...

  5. 服务器虚拟化架构设计,服务器虚拟化与数据中心I/O网络架构设计

    这是关于网络架构设计两部分系列中的第一篇.想了解关于在网络架构中整合I/O虚拟化方面的知识,请点击第二篇:如何将I/O虚拟化整合到网络体系架构中. 服务器虚拟化对于数据中心I/O网络架构的需求非常强烈 ...

  6. 数据虚拟化工具已进入IT战略领域

    数据虚拟化工具已经存在多年了,但鉴于现如今的企业都在积极的整合和访问来自网络.社交媒体和物联网(IoT)等各种来源的数据,使得这一技术的重要性正在越来越多的从企业的战术层面转向为战略层面. 在本次专家 ...

  7. Teiid:数据虚拟化Data Virtualization平台

    2019独角兽企业重金招聘Python工程师标准>>> Teiid介绍 http://teiid.jboss.org/ 数据虚拟化的定义 https://en.wikipedia.o ...

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

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

  9. 华为开源数据虚拟化引擎HetuEngine;全球超算500强:中国上榜数量增加;谷歌收购云计算公司CouldSimple ……...

    关注并标星星CSDN云计算 速递.最新.绝对有料.这里有企业新动.这里有业界要闻,打起十二分精神,紧跟fashion你可以的! 每周两次,打卡即read   更快.更全了解泛云圈精彩news   go ...

最新文章

  1. 资料分享:送你一本《数据结构(C#语言版)》电子书!
  2. MySQL主从同步问题集
  3. web页面事件无响应,元素点击不到
  4. java中8进制常量_下列关于Java语言简单数据类型的说法中,正确的一项是______。A.以0开头的整数代表8进制整型常量B....
  5. 电脑反应慢卡怎么解决_电脑开不了机怎么解决?
  6. php父子遍历,php无限分类父子追溯方法
  7. 启动activity的标准的action常量及对应的字符串
  8. php where or,php – laravel中whereOr和orWhere之间的区别
  9. 客服机器人代码_电脑问题不会解决?小白智能客服来帮你!
  10. python获取列表长度方法_python - 在Pandas df列中获取有关列表长度(平均长度,最大长度等)的统计信息的大多数pandas-onic方法 - 堆栈内存溢出...
  11. java mybatis 搭建_mybatis环境搭建(转载)
  12. hexo theme next7.8 主题美化
  13. c语言递归思想实践-整形数组求极值问题
  14. ACL——拒绝源地址
  15. 为什么犹太人能出这么多诺贝尔奖,看看他们的家庭教育吧!
  16. 西电计科计组期中复习要点
  17. 麦肯锡三部曲_越拼命工作,越不快乐?麦肯锡“提问式思维”帮你发现问题本质...
  18. php汉字转拼音库,汉字转拼音的PHP库
  19. 12306登录python_基于Python3的12306登录实现
  20. 新书《Linux就是这个范儿》预售

热门文章

  1. 微博粉丝平台开发全攻略
  2. AJAX如何做出输入框提示!
  3. 单编译framework相关模块
  4. 重用之前应仔细分析问题---------用错轮子有感
  5. 生成汉字拼音首字母函数!
  6. win10怎么设置默认浏览器_vscode如何设置默认打开的浏览器为Chrome?
  7. 西门子em235模块的功能_图文讲解PLC模拟量模块与传感器接线方法和注意事项
  8. weblogic 12 开启debug端口配置
  9. sender分析之Selector
  10. (82)Vivado系统同步接口约束