• 使用background thread解码图片

在Windows Phone中支持的图片格式有jpg和png,微软建议使用jpg格式的图片,因为jpg格式的图片在解码速度上要比png快。那么我们怎么来控制用后台线程来解码图片呢?看下面的代码。

<Image Height="100" Width="100" Margin="12,0,9,0">
<Image.Source>
<BitmapImage UriSource="{Binding ImgURL}" CreateOptions="BackgroundCreation"/>
</Image.Source>
</Image>
var bi = new BitmapImage();
bi.CreateOptions = BitmapCreateOptions.BackgroundCreation;

这两段代码都设置了BitmapImage的CreateOptions属性,这样做避免了在UI线程来对图片解码,在使用过程中BackgroundCreation确实有效地提高了页面的响应效率,尤其是在图片密集型的页面。需要注意的是,图片位置可能出现短暂的空白,不过这段时间我们可以通过一个图片占位符的方法来处理。CreateOptions属性包括有四种:

  1. None                           不对CreateOptions做任何设置。
  2. DelayCreation             是BitmapImage的默认属性,在必要时创建图片。
  3. IgnoreImageCache      图片将不启用缓存,适合于频繁需要更新的图片。
  4. BackgroundCreation    图片的解码在后台线程完成。
  • 减少不必要的PropertyChanged事件的触发

在MVVM模式的开发中,通过设置INotifyPropertyChanged接口使View作为一个观察者,可以使我们方便的通过DataBinding更新UI内容,这里我们要说的其实PropertyChanged事件是一个冗长的方法。如果你使用的是VS2012或更高的版本使用工具栏的Code Map按钮可以看到系统监听的add_PropertyChanged事件,而且它在UI线程上执行。为了减少不必要的PropertyChanged事件的触发,我们可以采用下面这种方法来对value的值提前做出判断。

public string Text
{
get { return _text;}
set
{
if( _text == value) return;
_text = value;
RaisePropertyChanged("Text");
}
}
  • 减少Databinding中Converter的使用

     在Databinding中我们可以创建一个继承自IValueConverter的类实现Convert方法来对绑定的值做进一步处理,这个处理会直接影响到绑定的速度,而且这个转换是在UI线程执行的,如果我们把一个很重的方法放在了这个Converter里,那绑定的速度就可想而知了。总之,对后台数据的处理还是在后台线程中准备好之后在通知UI更新,尽量避免因为Converter造成的UI阻塞。

  • 开启集合控件的虚拟化

在之前的一篇博客中我们介绍了在Windows Phone中集合控件的使用。VirtualizingStackPanel是一个重要的概念,在ListBox中默认的Itmes的容器就是VirtualizingStackPanel,这个容器是虚拟化的,不同于StackPanel。它只创建了大约屏幕可见的数量,而非将ListBox中的Items一次全部创建,随着上下滚动再次创建剩下为显示在屏幕上的内容。这样就大大节省了页面首次渲染的时间。

VirtualizingStackPanel还有一个比较重要的属性,就是VirtualizationMode。这个属性有两个值。

  1. Standard 每次都会为容器的Item创建新的VirtualizingStackPanel,并回收之前创建的容器。
  2. Recycling 重用之前创建的VirtualizingStackPanel。

显然我们开启VirtualizingStackPanel的Recycling模式来重用容器,避免新的容器的创建。下面是一个ListBox的示例代码。

<ListBox ItemsSource="{StaticResource data}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling" />
  • 动态加载PivotItem

在Windows Phone开发中轴心控件Pivot绝对是一个布局很好的选择。但是如果我们的页面的PivotItem比较多,会直接影响到我们页面的渲染时间,尤其是在首页的时候,等待的时间可能会更加长。这时候我们可以考虑动态的加载PivotItem的方法来减轻首次加载页面的时间,我们只需要在页面定义空的PivotItem,再在OnLoadingPivotItem的事件中动态的创建UserControl并加入到相应的PivotItem的Content中即可。

<controls:Pivot x:Name="pivot" OnLoadingPivotItem="OnLoading">
<controls:PivotItem x:Name="firstItem"/>
</controls:Pivot>
public void OnLoading(PivotItem item)
{
if(item.Content == null)
{
var userControl = new CustemControl();
item.Content = userControl;
}
}
  • 为ObservableCollection添加AddRange方法

ObservableCollection绝对是数据绑定过程中重要的集合,使用这个集合可以通过Add方法方便的更新集合。但当数据量大的情况下我们是否可以考虑自定义一个AddRange方法,来替换掉每次Add的时候触发的NotifyCollectionChangedAction.Add类型的事件。而改用NotifyCollectionChangedAction.Reset使整个页面只刷新一次。那么就来看看这个扩展类的写法。

public class ObservableCollectionEx<T> : ObservableCollection<T>
{
public void AddRange(IEnumerable<T> list)
{
foreach (T item in list)
{
Items.Add(item);
}
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
OnPropertyChanged(“Count”);
}
}
  • 使用Async、await、Task<TResult>异步编程

Windows Phone性能优化建议的更多相关文章

  1. Yahoo! 35条网站性能优化建议

    Yahoo! 35条网站性能优化建议 Yahoo!的 Exceptional Performance团队为改善 Web性能带来最佳实践.他们为此进行了一系列的实验.开发了各种工具.写了大量的文章和博客 ...

  2. Jquery学习笔记--性能优化建议

    一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 1 $('#content').hide(); 或 ...

  3. MySQL学习笔记:select语句性能优化建议

    关于SQL中select性能优化有以下建议,仅当笔记记录. 1.检查索引:where.join部分字段都该加上索引 2.限制工作数据集的大小:利用where字句过滤 3.只选择需要的字段:减少IO开销 ...

  4. Windows Phone 性能优化(一)

    在实际的项目开发过程中,应用的性能优化是一个永恒的话题,也是开发者群里最常讨论的话题之一,我在之 前的公司做 wp项目时,也遇到过性能的瓶颈.当页面中加载的内容越来越多时,内存涨幅非常明显(特别是 一 ...

  5. MySQL 启动参数说明及性能优化建议

    [mysqld] port = 3306 serverid = 1 socket = /tmp/mysql.sock skip-name-resolve #禁止MySQL对外部连接进行DNS解析,使用 ...

  6. 转载一些Android性能优化建议

    首先给出原文链接,感谢大神的经验分享:http://www.jointforce.com/jfperiodical/article/3553?utm_source=tuicool&utm_me ...

  7. oracle 性能优化建议小结

    原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHER ...

  8. python性能优化建议

    参考: https://segmentfault.com/a/1190000000666603 http://blog.csdn.net/zhoudaxia/article/details/23853 ...

  9. Windows Phone 性能优化(二)

    这篇文章的 demo 是在 (一)的基础上进行的调整,逻辑基本相似.本文只列和 上一篇出不同的代码. 为了实现自定义的虚拟化,把上一篇文章的 ListBox 换成 ScrollViewer + Ite ...

随机推荐

  1. 【PL/SQL练习】复合变量: 可以一次传递多个值到变量中。

    1.案例: 通过record类型处理一行多列的数据 复合变量--record 记录类型record:在一个变量中可以存储多个区域,每个区域可以是一个标量.记录或table (用于处理一行多列的信息) ...

  2. c#中using System.Runtime.Serialization.Json;不能引用

    原因:生成项目对于的.net版本是2.0的.需要手动切换成4.0 操作步骤:右键项目,属性页面,下拉框选择最高版本.net 截图:

  3. django+celery+redis环境搭建

    初次尝试搭建django+celery+redis环境,记录下来,慢慢学习~ 1.安装apache 下载httpd-2.0.63.tar.gz,解压tar zxvf httpd-2.0.63.tar. ...

  4. 酒鬼-DP

    Description Santo刚刚与房东打赌赢得了一间在New Clondike 的大客厅.今天,他来到这个大客厅欣赏他的奖品.房东摆出了一行瓶子在酒吧上.瓶子里都装有不同体积的酒.令Santo高 ...

  5. 学习资料 数据查询语言DQL

    数据查询语言DQL介绍及其应用: 查询是SQL语言的核心,SQL语言只提供唯一一个用于数据库查询的语句,即SELECT语句.用于表达SQL查询的SELECT语句是功能最强也是最复杂的SQL语句,它提供 ...

  6. OS版本调研

    1引言 1.1 编写目的 本文的主要目的是通过对当前项目中使用的各种版本的操作系统进行比较,分析各自特性和稳定程度,最终推荐合适的版本作为当前的标准系统. 1.2 背景 当前,部门负责管理维护的现网使 ...

  7. WF4与MVC结合示例

    很多初学者,首先最想解决的问题是:如何将WF与MVC程序相结合.由于Web程序属于长时间运行的流程,因此持续化功能的运用就非常重要了. 本文将结合书签.WorkflowApplication.生命周期 ...

  8. vsftp快速配置

    /etc/vsftpd/vsftpd.confanonymous_enable=YESlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage ...

  9. C++利用注册表添加桌面右键新建菜单

    对于程序员来说,新建一个cpp文件是再频繁不过的事情了. 为了方便,我们习惯在桌面右键新建文件,而不是新建一个文本文档,然后修改后缀名. 百度谷歌查询了一下,终于知道如何添加注册表. 手痒,抽出时间用 ...

  10. Aspose插件

    Eclipse安装地址: http://apps.aspose.com/marketplace/eclipse/asposewizardrepo