博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WP7 性能优化系列 (1)
阅读量:4919 次
发布时间:2019-06-11

本文共 4052 字,大约阅读时间需要 13 分钟。

1.    Image

默认情况下所有的图片的解码过程都是在UI线程同步进行,所以如果用如下方式显示图片将会阻塞UI线程:

<Image Source=”{Binding ImageUrl}”/>

 以上方式UI线程将对图片解码,此过程中UI会一直阻塞直到图片解码结束。

 解决方式如下:

<Image>

<Image.Source>

<BitmapImage UriSource="{Binding ImgUrl}" CreateOptions="BackgroundCreation"/>

</Image.Source>

</Image>

这两种显示图片方式在模拟器上验证时,不会对应用产生有明显的效果差别,因为在模拟器中对手机处理器的速度没有模拟

注意:用第二种种方式显示图片时在Blend中会提示“Invalid xaml”

详细信息请参考文章:  

2.    ListBox(ItemsControl)

需要在一个集合中显示不同类型的数据时,例如新鲜事、日志、状态等,往往会采用自定集合控件,然后在控件里根据数据类型采用不同的数据模板(具体做法将在错误用法里谈到)。这样的做法最大的影响就是放弃ListBox的缓冲机制,当ListBox发现它缓存的模板不能满足数据的需要时就会放弃缓存,这样做的结果就是只有在列表项Loaded时才匆忙的读取数据、寻找模板、加载到集合容器中,会造成很糟的用户体验。

正确的做法是把需要显示的所有模板放到一个数据模板中,然后使用例如Converter的方式(Converter的系统资源很小)决定显示/隐藏相应的模板。 

下面将分别介绍两种做法:

首先准备必要数据:

数据类 A、B (即要显示的不同数据类型), 数据源

private ObservableCollection dataSource = new ObservableCollection();        public ObservableCollection DataSource        {            get { return dataSource; }            set            {                dataSource = value;                if (this.PropertyChanged != null)                {                    this.PropertyChanged(this, new PropertyChangedEventArgs("DataSource"));                }            }        }        public MainPage()        {            InitializeComponent();            this.DataContext = this;            this.DataSource.Add(new A() { ID = 1, Name = "John", Department = "Product" });            this.DataSource.Add(new B() {  Title = "PM", Comment = "this is me" });            this.DataSource.Add(new A() { ID = 1, Name = "John", Department = "Product" });            this.DataSource.Add(new B() { Title = "Dev", Comment = "this is he" });            this.DataSource.Add(new B() { Title = "Designer", Comment = "this is cat" });            this.DataSource.Add(new A() { ID = 1, Name = "John", Department = "Product" });        }

错误用法

u  在资源中定义不同的样式          

u  自定义集合控件,并在控件中寻找不同的数据模板 

public class MyListBox : ItemsControl    {        protected override void PrepareContainerForItemOverride(DependencyObject element, object item)        {            base.PrepareContainerForItemOverride(element, item);            var container = (element as ContentPresenter);            var tmp = (App.Current as App).Resources["Tp1"] as DataTemplate;            if (item is B)            {                tmp = (App.Current as App).Resources["Tp2"] as DataTemplate;            }            container.ContentTemplate = tmp;        }    }

u  使用时没有区别 

以上就是普通的错误用法。 

下面展示正确的做法:

u  在资源中定义数据模板 

u  做转换器Converter 

public class DataTypeToVisibilityConverter : IValueConverter    {        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)        {            if (null == parameter || value == null)            {                return Visibility.Collapsed;            }            if (value is A && "AT".Equals(parameter.ToString()))            {                return Visibility.Visible;            }            if (value is B && "BT".Equals(parameter.ToString()))            {                return Visibility.Visible;            }            return Visibility.Collapsed;        }        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)        {            throw new NotImplementedException();        }    }

u  使用时无区别 

u  运行效果一样,下图显示两中做法的共同效果

 

可以看出两种做法的运行结果完全一样,但是数据结构比较复杂时第二种做法就提现了缓存的优势。

 

转载于:https://www.cnblogs.com/v-jing/archive/2012/06/14/2549359.html

你可能感兴趣的文章
unity 基础之PhysicsManager
查看>>
printf()详解之终极无惑
查看>>
Common Bugs in C Programming
查看>>
【java面试题】: String类、StringBuffer类、 StringBuilder类的区别
查看>>
各种数据库查询表及表信息的SQL
查看>>
IOS之网络数据下载和JSON解析
查看>>
:Spring-06 -AOP [面向切面编程] -配置异常通知的两种方式--AspectJ 方式 -Schema-based 方式...
查看>>
《网络是怎样连接的》第一章
查看>>
如何配置数据库ODBC数据源
查看>>
兼容性测试中如何切换和管理多个JDK版本
查看>>
vim自定义配置之nerdTree
查看>>
Power of Two & Power of Three & Power of Four
查看>>
21. Merge Two Sorted Lists
查看>>
随笔小记
查看>>
白盒测试的学习之路----(三)优化代码
查看>>
矩阵的旋转(90度)输出:
查看>>
纯虚函数(pure virtual function )和抽象类(abstract base class)
查看>>
《程序员修炼之道--从小工到专家》阅读笔记01
查看>>
【转】中国人唯一不认可的成功——就是家庭的和睦,人生的平淡
查看>>
[物理学与PDEs]第2章第5节 一维流体力学方程组的 Lagrange 形式 5.4 一维粘性热传导流体力学方程组的 Lagrange 形式...
查看>>