成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

提高WPF性能技巧分享

開(kāi)發(fā) 開(kāi)發(fā)工具
WPF性能的提高可以通過(guò)各種方法來(lái)實(shí)現(xiàn)。在這篇文章中我們就為大家總結(jié)了幾種提高WPF性能的技巧方法,希望對(duì)大家有所幫助。

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

在建立漂亮UI的同時(shí),我們還需要關(guān)注應(yīng)用程序的性能,WPF尤其如此。下面從MS的文檔中總結(jié)出了一些有用的性能優(yōu)化點(diǎn)。在實(shí)際編寫(xiě)的過(guò)程中,可以參考。這個(gè)Post非完全原創(chuàng),是根據(jù)一些文檔總結(jié)出來(lái)的。

1、建立邏輯樹(shù)的時(shí)候,盡量考慮從父結(jié)點(diǎn)到子結(jié)點(diǎn)的順序構(gòu)建。因?yàn)楫?dāng)邏輯樹(shù)的一個(gè)結(jié)點(diǎn)發(fā)生變化時(shí)(比如添加或刪除),它的父結(jié)點(diǎn)和所有的子結(jié)點(diǎn)都會(huì)激發(fā)Invalidation。我們應(yīng)該避免不必要的Invalidation。

2、當(dāng)我們?cè)诹斜恚ū热鏛istBox)顯示了一個(gè)CLR對(duì)象列表(比如List)時(shí),如果想在修改List對(duì)象后,ListBox也動(dòng)態(tài)的反映這種變化。此時(shí),我們應(yīng)該使用動(dòng)態(tài)的ObservableCollection對(duì)象綁定。而不是直接的更新ItemSource。兩者的區(qū)別在于直接更新ItemSource會(huì)使WPF拋棄ListBox已有的所有數(shù)據(jù),然后全部重新從List加載。而使用ObservableCollection可以避免這種先全部刪除再重載的過(guò)程,WPF性能更高。

3、在使用數(shù)據(jù)綁定的過(guò)程中,如果綁定的數(shù)據(jù)源是一個(gè)CLR對(duì)象,屬性也是一個(gè)CLR屬性,那么在綁定的時(shí)候?qū)ο驝LR對(duì)象所實(shí)現(xiàn)的機(jī)制不同,綁定的效率也不同。

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

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

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

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

  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. // 將緩存的數(shù)據(jù)標(biāo)識(shí)為無(wú)效   
  5. ((MyButton)d)._magicStringValid = false;   
  6. }   
  7. private static object MagicStringGet
    ValueCallback(DependencyObject d) {   
  8. // 調(diào)用緩存的訪問(wèn)器來(lái)獲取值   
  9. return ((MyButton)d).MagicString;   
  10. }   
  11. // 私有的CLR訪問(wèn)器和本地緩存 public 
    string MagicString {   
  12. get {   
  13. // 在當(dāng)前值無(wú)效時(shí),獲取***的值保存起來(lái) 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; 

另外,因?yàn)樽?cè)的DependencyProperty在默認(rèn)是不可繼承的,如果需要繼承特性,也會(huì)降低DependencyProperty值刷新的效率。注冊(cè)DependencyProperty屬性時(shí),應(yīng)該把DefaultValue傳遞給Register方法的參數(shù)來(lái)實(shí)現(xiàn)默認(rèn)值的設(shè)置,而不是在構(gòu)造函數(shù)中設(shè)置。

5、使用元素TextFlow和TextBlock時(shí),如果不需要TextFlow的某些特性,就應(yīng)該考慮使用TextBlock,因?yàn)樗男矢?,可以提高WPF性能。

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

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

8、把Label(標(biāo)簽)元素的ContentProperty和一個(gè)字符串(String)綁定的效率要比把字符串和TextBlock的Text屬性綁定的效率低。因?yàn)長(zhǎng)abel在更新字符串是會(huì)丟棄原來(lái)的字符串,全部重新顯示內(nèi)容。

9、在TextBlock塊使用HyperLinks時(shí),把多個(gè)HyperLinks組合在一起效率會(huì)更高。看下面的兩種寫(xiě)法,后一種效率高。

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有關(guān),顯示超鏈接的時(shí)候,盡量只在IsMouseOver為T(mén)rue的時(shí)候顯示下劃線,一直顯示下劃線的代碼高很多,以提高WPF性能。

11、在自定義控件,盡量不要在控件的ResourceDictionary定義資源,而應(yīng)該放在Window或者Application級(jí)。因?yàn)榉旁诳丶袝?huì)使每個(gè)實(shí)例都保留一份資源的拷貝。

12、如果多個(gè)元素使用相同的Brush時(shí),應(yīng)該考慮在資源定義Brush,讓他們共享一個(gè)Brush實(shí)例。

13、如果需要修改元素的Opacity屬性,***修改一個(gè)Brush的屬性,然后用這個(gè)Brush來(lái)填充元素。因?yàn)橹苯有薷脑氐腛pacity會(huì)迫使系統(tǒng)創(chuàng)建一個(gè)臨時(shí)的Surface。

14、在系統(tǒng)中使用大型的3D Surface時(shí),如果不需要Surface的HitTest功能,請(qǐng)關(guān)閉它。因?yàn)槟J(rèn)的HitTest會(huì)占用大量的CPU時(shí)間進(jìn)行計(jì)算。UIElement有應(yīng)該IsHitTestVisible屬性可以用來(lái)關(guān)閉HitTest功能。

責(zé)任編輯:曹凱 來(lái)源: IT168
相關(guān)推薦

2009-12-23 14:30:24

WPF顯示動(dòng)態(tài)GIF

2009-12-24 09:38:27

WPF用戶線程

2009-12-29 11:01:46

WPF淡入效果

2009-12-28 10:40:13

WPF調(diào)用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后臺(tái)控制動(dòng)畫(huà)

2017-11-06 13:25:25

MySQL數(shù)據(jù)庫(kù)技巧

2009-06-17 10:13:03

提高EJB性能

2009-12-23 10:29:01

WPF應(yīng)用程序

2011-06-28 13:56:43

JAVA

2011-06-09 16:14:14

2017-02-05 17:33:59

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

2013-01-08 16:05:23

Android開(kāi)發(fā)布局ViewStub

2020-09-23 09:20:58

代碼Java字符串

2022-01-09 23:06:39

JavaScript

2023-02-21 14:55:40

React開(kāi)發(fā)技巧

2011-07-05 14:59:17

java

2024-10-25 15:48:21

GPUPyTorch編程

2009-12-25 17:39:01

WPF驗(yàn)證
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产日韩一区二区三区 | 国产精品亚洲综合 | 国产精品揄拍一区二区 | 免费一区二区 | 在线免费观看日本视频 | 免费视频成人国产精品网站 | 国产欧美日韩一区 | 亚洲视频在线观看免费 | 午夜精品在线 | av在线电影网站 | 91精品国产综合久久久久久蜜臀 | 国产精品自产拍在线观看蜜 | 久久精品aaa| 在线视频三区 | 国产成人精品久久二区二区91 | 日韩三级一区 | 日韩精品在线看 | 特级特黄特色的免费大片 | 午夜免费视频 | 国产视频中文字幕在线观看 | 日韩免费一区 | 91久久精品日日躁夜夜躁欧美 | 99re热这里只有精品视频 | 亚洲国产高清免费 | 97伦理影院 | 免费亚洲视频 | 国产乱码精品一区二区三区忘忧草 | 国外成人在线视频 | 中文字幕欧美一区 | 不卡视频一区 | 色婷婷综合久久久久中文一区二区 | 欧美一级片黄色 | 亚洲天堂中文字幕 | 久久久国产精品一区 | 色免费在线视频 | 久久国内精品 | 中文字幕免费视频 | 亚洲区一区二 | 国产传媒毛片精品视频第一次 | 国产性生活一级片 | 亚洲精品一区二区三区在线 |