自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

提高WPF性能技巧分享

開發(fā) 開發(fā)工具
WPF性能的提高可以通過各種方法來實現。在這篇文章中我們就為大家總結了幾種提高WPF性能的技巧方法,希望對大家有所幫助。

WPF的應用可以幫助我們實現許多基于圖形界面方面的功能實現。不過在實際使用中,開發(fā)人員往往都追求更高性能的使用。在這里就介紹一下有關WPF性能的提高方法。#t#

在建立漂亮UI的同時,我們還需要關注應用程序的性能,WPF尤其如此。下面從MS的文檔中總結出了一些有用的性能優(yōu)化點。在實際編寫的過程中,可以參考。這個Post非完全原創(chuàng),是根據一些文檔總結出來的。

1、建立邏輯樹的時候,盡量考慮從父結點到子結點的順序構建。因為當邏輯樹的一個結點發(fā)生變化時(比如添加或刪除),它的父結點和所有的子結點都會激發(fā)Invalidation。我們應該避免不必要的Invalidation。

2、當我們在列表(比如ListBox)顯示了一個CLR對象列表(比如List)時,如果想在修改List對象后,ListBox也動態(tài)的反映這種變化。此時,我們應該使用動態(tài)的ObservableCollection對象綁定。而不是直接的更新ItemSource。兩者的區(qū)別在于直接更新ItemSource會使WPF拋棄ListBox已有的所有數據,然后全部重新從List加載。而使用ObservableCollection可以避免這種先全部刪除再重載的過程,WPF性能更高。

3、在使用數據綁定的過程中,如果綁定的數據源是一個CLR對象,屬性也是一個CLR屬性,那么在綁定的時候對象CLR對象所實現的機制不同,綁定的效率也不同。

A、數據源是一個CLR對象,屬性也是一個CLR屬性。對象通過TypeDescriptor/PropertyChanged模式實現通知功能。此時綁定引擎用TypeDescriptor來反射源對象。效率***。

B、數據源是一個CLR對象,屬性也是一個CLR屬性。對象通過INotifyPropertyChanged實現通知功能。此時綁定引擎直接反射源對象。WPF性能稍微提高。

C、數據源是一個DependencyObject,而且屬性是一個DependencyProperty。此時不需要反射,直接綁定。效率***。

4、訪問CLR對象和CLR屬性的效率會比訪問DependencyObject/DependencyProperty高。注意這里指的是訪問,不要和前面的綁定混淆了。但是,把屬性注冊為DependencyProperty會有很多的優(yōu)點:比如繼承、數據綁定和Style。所以有時候我們可以在實現DependencyProperty的時候,利用緩存機制來加速訪問速度:看下面的緩存例子:

  1. public static   
  2. readonly DependencyProperty 
    MagicStringProperty = DependencyProperty.
    Register("MagicString", typeof(string), 
    typeof(MyButton), new PropertyMetadata
    (new PropertyInvalidatedCallback(OnMagic
    StringPropertyInvalidated),new GetValue
    Override(MagicStringGetValueCallback)));   
  3. private static void OnMagicString
    PropertyInvalidated(DependencyObject d) {   
  4. // 將緩存的數據標識為無效   
  5. ((MyButton)d)._magicStringValid = false;   
  6. }   
  7. private static object MagicStringGet
    ValueCallback(DependencyObject d) {   
  8. // 調用緩存的訪問器來獲取值   
  9. return ((MyButton)d).MagicString;   
  10. }   
  11. // 私有的CLR訪問器和本地緩存 public 
    string MagicString {   
  12. get {   
  13. // 在當前值無效時,獲取***的值保存起來 if 
    (!_magicStringValid) {   
  14. _magicString = (string)GetValueBase
    (MagicStringProperty);   
  15. _magicStringValid = true;   
  16. }   
  17. return _magicString; }   
  18. set { SetValue(MagicString
    Property, value);   
  19. }   
  20. }   
  21. private string _magicString;   
  22. private bool _magicStringValid; 

另外,因為注冊的DependencyProperty在默認是不可繼承的,如果需要繼承特性,也會降低DependencyProperty值刷新的效率。注冊DependencyProperty屬性時,應該把DefaultValue傳遞給Register方法的參數來實現默認值的設置,而不是在構造函數中設置。

5、使用元素TextFlow和TextBlock時,如果不需要TextFlow的某些特性,就應該考慮使用TextBlock,因為它的效率更高,可以提高WPF性能。

6、在TextBlock中顯式的使用Run命令比不使用Run命名的代碼要高。

7、在TextFlow中使用UIElement(比如TextBlock)所需的代價要比使用TextElement(比如Run)的代價高。

8、把Label(標簽)元素的ContentProperty和一個字符串(String)綁定的效率要比把字符串和TextBlock的Text屬性綁定的效率低。因為Label在更新字符串是會丟棄原來的字符串,全部重新顯示內容。

9、在TextBlock塊使用HyperLinks時,把多個HyperLinks組合在一起效率會更高??聪旅娴膬煞N寫法,后一種效率高。

A

  1. < TextBlock Width="600" >   
  2. < Hyperlink TextDecorations="None">
    MSN Home< /Hyperlink> < /TextBlock>   
  3. < TextBlock Width="600" >   
  4. < Hyperlink TextDecorations="None">
    My MSN< /Hyperlink> < /TextBlock> 

B

  1. < TextBlock Width="600" >   
  2. < Hyperlink TextDecorations="None">
    MSN Home< /Hyperlink> 
    < Hyperlink TextDecorations="None">
    My MSN< /Hyperlink> < /TextBlock> 

 10、任與上面TextDecorations有關,顯示超鏈接的時候,盡量只在IsMouseOver為True的時候顯示下劃線,一直顯示下劃線的代碼高很多,以提高WPF性能。

11、在自定義控件,盡量不要在控件的ResourceDictionary定義資源,而應該放在Window或者Application級。因為放在控件中會使每個實例都保留一份資源的拷貝。

12、如果多個元素使用相同的Brush時,應該考慮在資源定義Brush,讓他們共享一個Brush實例。

13、如果需要修改元素的Opacity屬性,***修改一個Brush的屬性,然后用這個Brush來填充元素。因為直接修改元素的Opacity會迫使系統(tǒng)創(chuàng)建一個臨時的Surface。

14、在系統(tǒng)中使用大型的3D Surface時,如果不需要Surface的HitTest功能,請關閉它。因為默認的HitTest會占用大量的CPU時間進行計算。UIElement有應該IsHitTestVisible屬性可以用來關閉HitTest功能。

責任編輯:曹凱 來源: IT168
相關推薦

2009-12-24 09:38:27

WPF用戶線程

2009-12-23 14:30:24

WPF顯示動態(tài)GIF

2009-12-29 11:01:46

WPF淡入效果

2009-12-28 10:40:13

WPF調用Winfor

2009-12-09 17:33:22

PHP性能優(yōu)化

2010-02-23 16:46:47

WCF并發(fā)能力

2009-12-25 10:11:46

WPF后臺控制動畫

2017-11-06 13:25:25

MySQL數據庫技巧

2009-06-17 10:13:03

提高EJB性能

2009-12-23 10:29:01

WPF應用程序

2011-06-28 13:56:43

JAVA

2017-02-05 17:33:59

前端優(yōu)化Web性能

2013-01-08 16:05:23

Android開發(fā)布局ViewStub

2020-09-23 09:20:58

代碼Java字符串

2011-06-09 16:14:14

2024-10-25 15:48:21

GPUPyTorch編程

2011-07-05 14:59:17

java

2022-01-09 23:06:39

JavaScript

2023-02-21 14:55:40

React開發(fā)技巧

2009-12-25 17:39:01

WPF驗證
點贊
收藏

51CTO技術棧公眾號