上文解决了虚拟化的问题,使得类Grid的多列布局ListBox也能实现虚拟化,可以说性能已经有了飞跃

但我的书中圣在使用过程中,仍然发现滑动起来卡卡的,上文的Demo大家可能注意到,即使是WrapPanel也仅是加载的时候很慢,滑动的时候也是流畅的,本文的内容就是关于ListBoxItem的结构复杂度问题。

注意观察上文的Demo,大家可以发现,ListBox的ItemTemplete非常简单,一个简单的色块加一行文字,这种情况下,排除加载速度,那么滑动性能是我们能接受的,但是,书中圣是这样的情况:

1)使用图片

2)相对复杂的布局

结果就使得列表滑动起来跳帧非常严重

这里有几种解决方案,Alexis有一篇文章很好的总结了几种提高ListBox性能体验的方式:http://www.cnblogs.com/alexis/archive/2011/06/12/2040565.html

经过权衡,我决定采用LazyListBox,但是在使用过程中发现:

1)可能是因为图片的关系,导致简单模板和复杂模板在切换过程中非常生硬

2)只要出发滚动/滑动事件,那么就会重新渲染一次

所以最终令我哭笑不得的是,书中圣使用了该项技术后,体验反而不如原来的。这里要指出的是,如果你是纯文本的项,那么还是可以用LazyListBox的,我并不是否定他,而是说要因地制宜,根据自身的情况选用。

最终只能放弃使用,同时我注意到,当我不使用图片,或者将ListBox的ItemTemplete结构变得简单时,ListBox的性能大幅度提升,所以我决定精简模板结构。

这是原来的模板:

            <Grid CacheMode="BitmapCache" Height="200" Margin="{StaticResource PhoneMargin}" Width="190"><Border Margin="{StaticResource AppMainBookProjectionMargin}" Background="Transparent"><toolkit:ContextMenuService.ContextMenu><toolkit:ContextMenu IsZoomEnabled="False" Opened="ContextMenu_Opened" Closed="ContextMenu_Closed"><toolkit:MenuItem Header="{Binding Strings.ContextMenuDelete, Source={StaticResource ApplicationResources}}" Click="BookshelfBoxMenuItem_Click_Delete"/></toolkit:ContextMenu></toolkit:ContextMenuService.ContextMenu><toolkit:GestureService.GestureListener><toolkit:GestureListener Tap="Book_Tapped"/></toolkit:GestureService.GestureListener><Grid Margin="8,0,0,0"><Grid.RowDefinitions><RowDefinition/><RowDefinition Height="Auto"/></Grid.RowDefinitions><TextBlock Text="{Binding BookName}" TextWrapping="Wrap" FontSize="{StaticResource PhoneFontSizeMediumLarge}" d:LayoutOverrides="GridBox" Margin="{StaticResource AppMainBookInfoMargin}"/><TextBlock Text="{Binding Author, Converter={StaticResource WriterFotmatConverter}}"Style="{StaticResource PhoneTextSubtleStyle}" Foreground="{StaticResource PhoneSubtleBrush}" Grid.Row="1" TextAlignment="Right" FontFamily="{StaticResource AppFont}" Margin="{StaticResource AppMainBookInfoHorizontalMargin}" TextWrapping="Wrap"/></Grid></Border><Button x:Name="Bookmark" CacheMode="BitmapCache" Visibility="{Binding Bookmarks.Count, Converter={StaticResource BookmarkVisibilityConverter}}" Style="{StaticResource SimpleButton}" Click="BookmarkButton_Click_Show" FontFamily="{StaticResource AppFont}" Margin="{StaticResource AppMainBookmarkButtonMargin}" HorizontalAlignment="Right" VerticalAlignment="Bottom" Background="{StaticResource AppBookmarkButtonBackground}" BorderBrush="{x:Null}" d:LayoutOverrides="HorizontalAlignment"><Border Background="{StaticResource AppBookmarkButtonBackground}" Height="80" Width="55" /></Button></Grid>

可以看到其实也不是很复杂,无非就是几个Grid嵌套,这里是改进后的模板:

            <Border Background="Transparent"><Canvas CacheMode="BitmapCache" Margin="{StaticResource PhoneMargin}"Height="200" Width="190"><Rectangle x:Name="Background" CacheMode="BitmapCache" Fill="{StaticResource AppBookSingleBackground}" Height="200" Width="190" StrokeThickness="0"/><Button Visibility="{Binding Bookmarks.Count, Converter={StaticResource BookmarkVisibilityConverter}}" x:Name="Bookmark" CacheMode="BitmapCache" Style="{StaticResource ButtonStyleForBookmark}" Background="{StaticResource AppBookmarkButtonBackground}"Canvas.Left="138" Canvas.Top="96" Width="50" Height="80"/><TextBlock Text="{Binding BookName}" TextWrapping="Wrap" FontSize="{StaticResource PhoneFontSizeMediumLarge}" Canvas.Left="20" Canvas.Top="14" Width="108" Height="147"/><Border Height="170" Width="108"Canvas.Left="20" Canvas.Top="14"><TextBlock Text="{Binding Author}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneSubtleBrush}" TextAlignment="Right" TextWrapping="Wrap" VerticalAlignment="Bottom"/></Border><Border Visibility="{Binding ManageState, Converter={StaticResource BookStateConverter}}"Height="32" Width="32" Background="{StaticResource AppMainBooksStateDeleteBrush}" Canvas.Left="-10" Canvas.Top="-8"/></Canvas></Border>
 
 

变化在于:

1)取消Grid布局,改用Canvas,将嵌套结构尽量拉平,精简复杂度

2)取消对单个Item的手势和右键菜单监听,在ListBox外围放置统一的监听

经过这两个改造,列表在滑动时性能有少许上升,已经跳帧没有那么厉害了

一点小经验,欢迎大侠扔砖头

我的另一个产品博客,关于桌面小工具和Windows Phone 7应用作品的,欢迎访问:http://mohoo.cc

转载于:https://www.cnblogs.com/zjfeiye/archive/2011/07/15/2107112.html

ListBox优化初步(二)相关推荐

  1. ListBox优化初步(一)

    在书中圣的版本更新历程中,碰到了诸多问题,其中一个就是ListBox当使用WrapPanel时的性能问题 WrapPanel不是原生控件,它来自于 使用它可以实现ListBox的多列布局(如图一),但 ...

  2. webpack4.0打包优化策略(二)

    打包优化策略 webpack4.0打包优化策略(一) webpack4.0打包优化策略(二) webpack4.0打包优化策略(三) 区分开发和生产环境 通常我们在开发网页时需要区分构建环境 开发环境 ...

  3. Java Web 前端高性能优化(二)

    2019独角兽企业重金招聘Python工程师标准>>> ######一.上文回顾 上回我们主要从图片的合并.压缩等方面介绍前端性能优化问题(详见Java Web 前端高性能优化(一) ...

  4. Java Web 前端高性能优化(二) 1

    一.上文回顾 上回我们主要从图片的合并.压缩等方面介绍前端性能优化问题(详见Java Web 前端高性能优化(一)) 本次我们主要从图像BASE64 编码.GZIP压缩.懒加载与预加载以及 OneAP ...

  5. VS.NET2005中的WEBPART初步(二)

    VS.NET2005中的WEBPART初步(二)      上一个小节中,我们用WEBPART实现了网页的一个小的布局,其实在这个页面中已经实现了一个小小的个性化了,用户已经可以最小化.最大化及关闭W ...

  6. mysql删除unionkey_MySQL索引如何优化?二十条铁则送给你

    前言 索引的相信大家都听说过,但是真正会用的又有几人?平时工作中写SQL真的会考虑到这条SQL如何能够用上索引,如何能够提升执行效率? 此篇文章详细的讲述了索引优化的几个原则,只要在工作中能够随时应用 ...

  7. Android 系统性能优化(38)---Android内存优化之二:MAT使用进阶

    Android内存优化之二:MAT使用进阶 第一篇文章<Android内存优化之一:MAT使用入门>介绍了MAT的基本使用方法,包括下载.安装.打开HPROF文件,和一些基本的视图.这篇文 ...

  8. SQL Server提高事务复制效率优化(二)快照初始化优化

    SQL Server提高事务复制效率优化(二)快照初始化优化 测试数据表量1500w+,使用初始化默认的快照代理参数,复制的三个过程包括快照初始化,订阅初始化和数据修改复制,主要对快照代理.分发代理. ...

  9. 数字逻辑综合工具实践-DC-07 ——综合优化(二)和RTL coding 和DFT

    数字逻辑综合工具实践-DC-07 --综合优化(二)和RTL coding 和DFT 主要内容: 1. Pipeline优化 2. RTL设计时的一些注意事项 3. DFT简介 (DFT是后端里很重要 ...

最新文章

  1. C++ 输入输出流 文本文件 二进制文件读写
  2. sum()转字符串_Python字符串与内置函数
  3. 定义加密函数程序python_一个python自定义的加密解密函数
  4. C# 给picturebox添加滚动条
  5. 项目管理——N个模板
  6. 以ASK调制解调为例观察采样与成型滤波的MATLAB仿真
  7. USB有线网卡怎么用
  8. 优化你简历的8个技巧
  9. cmd中start 命令用法
  10. 三条中线分的六个三角形_一个三角形的三条中线分别是3、4、5,求这个三角形的面积...
  11. POJ 2706 棋盘连线游戏(模拟)
  12. 华清远见嵌入式培训_第六周回顾与反思
  13. 微软宣布IE进入死亡倒计时 回顾IE传奇的一生
  14. 关于汉字转拼音的Pinyin4j工具使用
  15. 【C++】链表及基本操作
  16. 主题模型TopicModel:隐含狄利克雷分布LDA
  17. 实验楼Linux基础挑战2答案,实验楼-Linux基础-实验二 Linux的基本概念及操作
  18. 有偿寻找安卓三维模型查看引擎
  19. “8 岁学编程,做了近 40 年程序员,我总结了 15 条经验宝典”
  20. ML - 贷款用户逾期情况分析5 - 特征工程2(特征选择)

热门文章

  1. 链家网页爬虫_分享最近做的一个链家二手房爬虫和对爬到的数据进行可视化分析的案例...
  2. B站后台源代码泄露,官方回应声明黑话指南
  3. 互联网产品的定义及分类
  4. 线性代数:03 向量空间 -- 向量的内积和正交阵
  5. 新基建!腾讯宣布投入5000亿
  6. 清华集训2014 玛里苟斯
  7. Spark Mllib 下的决策树二元分类 —— 网站分类(1)
  8. 包装exp是什么意思_美国商品包装上写的EXP/09/11是什么意思?
  9. 微服务架构系列主题:微服务架构概述
  10. 强化学习之Q-learning算法