WPF之性能优化点

1.在创建逻辑树视图时,应尽量考虑从父节点到子节点的顺序构建。因为当逻辑树的一个结点发生变化(增,删,改),它的父结点和所有子结点都会被激活Invalidation事件,我们应尽量避免不必要的Invalidation。

2.在列表(如ListBox)显示一个CLR列表对象(List)时,如果在List数据发生变化时,绑定的ListBox控件里显示的数据也随之改变,那应使用动态的ObservableCollection对象绑定,不是直接去更新ItemSource。直接更新ItemSource会使WPF抛弃ListBox已有的原数据,然后再重新去加载。而使用ObservableCollection可以避免这种情况,效率更高。

3.在使用元素TextFlow和TextBlock时,如果不需要TextFlow的某些特性,就应该考虑使用TextBlock,因为效率要更好。

4.在使用数据绑定的过程中,如果绑定的数据源是一个CLR对象,属性也是CLR属性,在绑定的时候对象CLR对象所实现的机制不同,绑定的效率也不同。

A、数据源是一个CLR对象,属性也是一个CLR属性。对象通过TypeDescriptor/PropertyChanged模式实现通知功能。 此时绑定引擎用TypeDescriptor来反射源对象。效率最低。

B、数据源是一个CLR对象,属性也是一个CLR属性。 对象通过INotifyPropertyChanged实现通知功能。此时绑定引擎直接反射源对象。效率稍微提高。

C、数据源是一个DependencyObject,而且属性是一个DependencyProperty。此时不需要反射,直接绑定。效率最高。

 附:访问CLR对象和CLR属性的效率会比访问DependencyObject/DependencyProperty高。注意这里指的是访问,不要和前面的绑定混淆了。但是,把属性注册为DependencyProperty会有很多的优点:比如继承、数据绑定和Style。 所以有时候我们可以在实现DependencyProperty的时候,利用缓存机制来加速访问速度

5.在TextBlock中显式的使用Run命令比不使用Run命名的代码效率要高。

6.在TextFlow中使用UIElement(如TextBlock)所需要的代价要比使用TextElement(如Run)的代价高。

7.把Lable标签的ContentProperty和一个字符串(string)绑定的效率要比把字符串和TextBlock的Text属性绑定的效率低。因为Label在更新字符串是会丢弃原来的字符串,全部重新显示内容。

8.在TextBlock块使用HyperLinks时,把多个HyperLinks组合在一起效率会更高。看下面的两种写法,后一种效率高。

A、 <TextBlock Width="600" >< Hyperlink TextDecorations="None">MSN Home</Hyperlink>< /TextBlock>< TextBlock Width="600" >< Hyperlink TextDecorations="None">My MSN</Hyperlink>< /TextBlock> 

B、 <TextBlock Width="600" >< Hyperlink TextDecorations="None">MSN Home</Hyperlink>< Hyperlink TextDecorations="None">My MSN</Hyperlink>< /TextBlock>

9.任与上面TextDecorations有关,显示超链接的时候,尽量只在IsMouseOver为True的时候显示下划线,一直显示下划线的代码高很多。

10.在自定义控件,尽量不要在控件的ResourceDictionary定义资源,而应该放在Window或者Application级。因为放在控件中会使每个实例都保留一份资源的拷贝。 另外如果多个元素使用相同的Brush时,应该考虑在资源

posted @ 2013-03-13 17:04  Gavin_gzm  阅读(202)  评论(0编辑  收藏  举报