WPF效能優化點 出自《 》

2021-05-23 19:03:56 字數 3172 閱讀 7430

在建立漂亮

ui的同時,我們還需要關注應用程式的效能,

wpf尤其如此。下面從

ms的文件中總結出了一些有用的效能優化點。在實際編寫的過程中,可以參考。這個

post

非完全原創,是根據一些文件總結出來的。

1、建立邏輯樹的時候,盡量考慮從父結點到子結點的順序構建。因為當邏輯樹的乙個結點發生變化時(比如新增或刪除),它的父結點和所有的子結點都會激發

invalidation

。我們應該避免不必要的

invalidation。2

、當我們在列表(比如

listbox

)顯示了乙個

clr物件列表(比如

list

)時,如果想在修改

list

物件後,

listbox

也動態的反映這種變

化。此時,我們應該使用動態的

observablecollection

物件繫結。而不是直接的更新

itemsource

。兩者的區別在於直接更新

itemsource

會使wpf

拋棄listbox

已有的所有資料,然後全部重新從

list

載入。而使用

observablecollection

可以避免這種先全部刪除再過載的過程,效率更高。

3、在使用資料繫結的過程中,如果繫結的資料來源是乙個

clr物件,屬性也是乙個

clr屬性,那麼在繫結的時候物件

clr物件所實現的機制不同,繫結的效率也不同。

a、資料來源是乙個

clr物件,屬性也是乙個

clr屬性。物件通過

typedescriptor/propertychanged

模式實現通知功能。此時繫結引擎用

typedescriptor

來反射源物件。效率最低。

b、資料來源是乙個

clr物件,屬性也是乙個

clr屬性。物件通過

inotifypropertychanged

實現通知功能。此時繫結引擎直接反射源物件。效率稍微提高。

c、資料來源是乙個

dependencyobject

,而且屬性是乙個

dependencyproperty

。此時不需要反射,直接繫結。效率最高。

4、訪問

clr物件和

clr屬性的效率會比訪問

dependencyobject/dependencyproperty

高。注意這裡指的是訪問,不要和

前面的繫結混淆了。但是,把屬性註冊為

dependencyproperty

會有很多的優點:比如繼承、資料繫結和

style

。所以有時候我們可以在實現

dependencyproperty

的時候,利用快取機制來加速訪問速度:看下面的快取例子:

另外,因為註冊的

dependencyproperty

在預設是不可繼承的,如果需要繼承特性,也會降低

dependencyproperty

值重新整理的效

率。註冊

dependencyproperty

屬性時,應該把

defaultvalue

傳遞給register

方法的引數來實現預設值的設定,而不是在構

造函式中設定。

5、使用元素

textflow

和textblock

時,如果不需要

textflow

的某些特性,就應該考慮使用

textblock

,因為它的效率更高。6、在

textblock

中顯式的使用

run命令比不使用

run命名的**要高。7、在

textflow

中使用uielement

(比如textblock

)所需的代價要比使用

textelement

(比如run

)的代價高。8、把

label

(標籤)元素的

contentproperty

和乙個字串(

string

)繫結的效率要比把字串和

textblock

的text

屬性繫結的效率低。因為

label

在更新字串是會丟棄原來的字串,全部重新顯示內容。9、在

textblock

塊使用hyperlinks

時,把多個

hyperlinks

組合在一起效率會更高。看下面的兩種寫法,後一種效率高。a、

b、 10

、任與上面

textdecorations

有關,顯示超連結的時候,盡量只在

ismouseover

為true

的時候顯示下劃線,一直顯示下劃線的**高很多。

11、在自定義控制項,盡量不要在控制項的

resourcedictionary

定義資源,而應該放在

window

或者級。因為放在控制項中會使每個例項都保留乙份資源的拷貝。

12、如果多個元素使用相同的

brush

時,應該考慮在資源定義

brush

,讓他們共享乙個

brush

例項。13

、如果需要修改元素的

opacity

屬性,最後修改乙個

brush

的屬性,然後用這個

brush

來填充元素。因為直接修改元素的

opacity

會迫使系統建立乙個臨時的

su***ce。14

、在系統中使用大型的

3d su***ce

時,如果不需要

su***ce

的hittest

功能,請關閉它。因為預設的

hittest

會占用大量的

cpu時間進行計算。

uielement

有應該i****testvisible

屬性可以用來關閉

hittest

功能。

依然是浮雲。。。

WPF 效能優化

wpf windows presentation foundation 是微軟推出的基於windows的使用者介面框架,執行在 net framework 3.0及以上版本。wpf是基於directx引擎的,支援gpu硬體加速,在不支援硬體加速時也可以使用軟體繪製。儘管wpf有諸多優點,有時我們還是...

WPF 效能優化 14 點

建立漂亮 ui 時需要關注應用程式的效能,wpf 尤其如此。以下是從 ms 文件中總結出的一些關鍵的效能優化點,實際編寫中可備參考。1 建立邏輯樹時,盡量考慮從父結點到子結點的順序構建。因為當邏輯樹的乙個結點發生變化時 比如新增或刪除 它的父結點和所有的子結點都會激發 invalidation。程式...

閒話WPF之二六(WPF效能優化點)

在建立漂亮ui的同時,我們還需要關注應用程式的效能,wpf尤其如此。下面從ms的文件中總結出了一些有用的效能優化點。在實際編寫的過程中,可以參考。這個post非完全原創,是根據一些文件總結出來的。1 建立邏輯樹的時候,盡量考慮從父結點到子結點的順序構建。因為當邏輯樹的乙個結點發生變化時 比如新增或刪...