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

WPF性能優(yōu)化經驗總結

開發(fā) 開發(fā)工具
WPF性能優(yōu)化可以通過以下幾個方面來實現(xiàn):Rendering Tier、布局和設計、圖像、對象行為、應用程序資源、文本、數(shù)據綁定、其它性能建議等。

開發(fā)人員在使用WPF做圖形界面的時候,通常都希望能有一個高效的利用率。在這里我們就為大家介紹一下有關WPF性能優(yōu)化的幾種方法。#t#

WPF性能優(yōu)化一、Rendering Tier

1. 根據硬件配置的不同,WPF采用不同的Rendering Tier做渲染。下列情況請?zhí)貏e注意,因為在這些情況下,即使是處于Rendering Tier 2的情況下也不會硬件加速。(不全,其余請查閱SDK)

Bitmap effects, Printed content, Tiled content that uses TileBrush, Layered windows.

下列情況為Layered window: 1. WindowStyle = none, 2.AllowsTransparency = true, 3.Background = Transparent.

WPF性能優(yōu)化二、布局和設計

1.盡量多使用Canvas等簡單的布局元素,少使用Grid或者StackPanel等復雜的,越復雜性能開銷越大。

2.建立邏輯樹或者視覺樹的時候,遵循Top-Down的原則。示例代碼如下:

 

  1. C#   
  2. private void OnBuildTreeTopDown
    (object sender, RoutedEventArgs e)  
  3. {  
  4. TextBlock textBlock = new TextBlock();  
  5. textBlock.Text = "Default";  
  6. DockPanel parentPanel = new DockPanel();  
  7. DockPanel childPanel;  
  8. myCanvas.Children.Add(parentPanel);  
  9. myCanvas.Children.Add(textBlock);  
  10. for (int i = 0; i <  150; i++)  
  11. {  
  12. textBlock = new TextBlock();  
  13. textBlock.Text = "Default";  
  14. parentPanel.Children.Add(textBlock);  
  15. childPanel = new DockPanel();  
  16. parentPanel.Children.Add(childPanel);  
  17. parentPanel = childPanel;  
  18. }  

 

WPF性能優(yōu)化三、圖像

1. 對Image做動畫處理的時候(如調整大小等),可以使用這條語句RenderOptions.SetBitmapScalingMode(MyImage,BitmapScalingMode.LowQuality),以改善性能。

2. 用TileBrush的時候,可以CachingHint。

WPF性能優(yōu)化四、對象行為

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


 

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

 

 

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

 

WPF性能優(yōu)化五、應用程序資源

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

2. 盡量使用Static Resources,但不能盲目使用。

WPF性能優(yōu)化六、文本

1. 文字少的時候用TextBlock或者label,長的時候用FlowDocument.

2. 使用元素TextFlow和TextBlock時,如果不需要TextFlow的某些特性,就應該考慮使用TextBlock,因為它的效率更高。

3. 在TextFlow中使用UIElement(比如TextBlock)所需的代價要比使用TextElement(比如Run)的代價高.在FlowDocument中盡量避免使用TextBlock,要用Run替代。代碼如下:

 

  1. < FlowDocument> 
  2. < !-- Text content within 
    a Run (more efficient). --
    > 
  3. < Paragraph> 
  4. < Run>Line one< /Run> 
  5. < /Paragraph> 
  6. < !-- Text content within 
    a TextBlock (less 
    efficient). --
    > 
  7. < Paragraph> 
  8. < TextBlock>Line two
    < /TextBlock> 
  9. < /Paragraph> 
  10. < /FlowDocument> 

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

 

  1. < !-- Run is used to set 
    text properties. --
    > 
  2. < TextBlock> 
  3. < Run FontWeight="Bold">
    Hello, world< /Run> 
  4. < /TextBlock> 
  5. < !-- TextBlock is used 
    to set text properties, 
    which is more efficient. --
    > 
  6. < TextBlock FontWeight=
    "Bold"> 
  7. Hello, world  
  8. < /TextBlock> 

 

5. 把Label(標簽)元素的ContentProperty和一個字符串(String)綁定的效率要比把字符串和TextBlock的Text屬性綁定的效率低。因為Label在更新字符串是會丟棄原來的字符串,全部重新顯示內容。如果字符串不需要更新,用Label就無所謂性能問題。

6. 在TextBlock塊使用HyperLinks時,把多個HyperLinks組合在一起效率會更高。

 

  1. < !-- Hyperlinks in separate 
    TextBlocks. --
    > 
  2. < TextBlock> 
  3. < Hyperlink TextDecorations=
    "None" NavigateUri="http:
    //www.msn.com"
    >MSN Home
    < /Hyperlink> 
  4. < /TextBlock> 
  5. < TextBlock Text=" | "/> 
  6. < TextBlock> 
  7. < Hyperlink TextDecorations=
    "None" NavigateUri="http:
    //my.msn.com"
    >My MSN< /Hyperlink> 
  8. < /TextBlock> 
  9. < !-- Hyperlinks combined 
    in the same TextBlock. --
    > 
  10. < TextBlock> 
  11. < Hyperlink TextDecorations=
    "None" NavigateUri="http:
    //www.msn.com"
    >MSN Home< /Hyperlink> 
  12. < Run Text=" | " /> 
  13. < Hyperlink TextDecorations=
    "None" NavigateUri="http:
    //my.msn.com"
    >My MSN< /Hyperlink> 
  14. < /TextBlock> 

7. 顯示超鏈接的時候,盡量只在IsMouseOver為True的時候顯示下劃線,一直顯示下劃線的代碼高很多

8. 盡量不使用不必要的字符串連接。

WPF性能優(yōu)化七、數(shù)據綁定

1.在使用數(shù)據綁定的過程中,如果綁定的數(shù)據源是一個CLR對象,屬性也是一個CLR屬性,那么在綁定的時候對象CLR對象所實現(xiàn)的機制不同,綁定的效率也不同。

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

B、數(shù)據源是一個CLR對象,屬性也是一個CLR屬性。對象通過INotifyPropertyChanged實現(xiàn)通知功能。此時綁定引擎直接反射源對象。效率稍微提高。

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

2.當一個CLR對象很大時,比如有1000個屬性時,盡量把這個對象分解成很多很小的CLR對象。比如分成1000個只有一個屬性的CLR對象。

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

4. 盡量綁定IList而不是IEnumerable到ItemsControl。

WPF性能優(yōu)化八、其它性能建議

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

2. 用NavigationWindow的時候,盡量Update the client area by object,而不是URI

3. 盡量不要使用ScrollBarVisibility=Auto

責任編輯:曹凱 來源: 博客園
相關推薦

2010-04-21 12:49:57

Oracle性能

2009-12-25 15:58:37

WPF數(shù)據處理

2010-03-23 11:39:49

云計算

2009-10-15 09:27:00

2009-03-11 15:40:20

2017-11-09 17:35:21

數(shù)據庫OracleSQL優(yōu)化

2009-09-16 17:13:54

學習Linq

2009-08-19 09:24:43

AJAX引擎經驗總結

2009-09-29 16:32:11

OJB Hiberna

2011-03-28 17:12:36

sql server數(shù)優(yōu)化

2009-09-16 17:44:54

LINQ to SQL

2009-09-08 10:57:55

LINQ查詢操作

2011-07-08 13:15:52

JSP

2009-09-11 13:29:31

LINQ查詢操作

2009-10-22 15:07:12

綜合布線工程

2009-11-17 11:24:00

PHP應用技巧

2010-06-12 17:37:18

UML實踐指南

2009-09-08 16:02:47

Linq使用Group

2009-08-20 17:35:47

Servlet和JSP

2011-07-21 13:40:17

java
點贊
收藏

51CTO技術棧公眾號