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

2021-09-05 15:49:15 字數 2637 閱讀 9125

在建立漂亮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的時候,利用快取機制來加速訪問速度:看下面的快取例子:

public static readonly dependencyproperty magicstringproperty =

dependencyproperty.register("magicstring", typeof(string), typeof(mybutton), new propertymetadata(new propertyinvalidatedcallback(onmagicstringpropertyinvalidated),new getvalueoverride(magicstringgetvaluecallback)));

private static void onmagicstringpropertyinvalidated(dependencyobject d)

private static object magicstringgetvaluecallback(dependencyobject d)

// 私有的clr訪問器和本地快取

public string magicstring

return _magicstring;

}set

}private string _magicstring;

private bool _magicstringvalid;

另外,因為註冊的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、msn home

my msn

b、msn home

my msn

10、任與上面textdecorations有關,顯示超連結的時候,盡量只在ismouseover為true的時候顯示下劃線,一直顯示下劃線的**高很多。

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中的Style)

style是一種修改屬性值是方法。我們可以將其理解為對屬性值的批處理。對批處理大家應該不會感到預設。對,通過style我們可以批量修改屬性的值。先從乙個簡單的style例子開始 xmlns x title viewer3d settings 第一感覺你可能會奇怪,為什麼style在資源裡呢?我個人直...

WPF 效能優化

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

閒話WPF之一(WPF的結構)

wpf 個人認為在 ui的實踐中,使用者需要的是易於操作的,更加絢麗的介面。這兩個應該是最基本 也是最重要的宗旨。而對於開發人員就是要用最簡單的方法開發出盡可能漂亮的介面,並且效率也不能太差。要求是不是有些過分啦!除了在一些 web開發和特殊的應用中,很少有開發組配備單獨的美工,至少目前是這樣吧!根...