[WPF系列]-DynamicResource与StaticResource的区别
探討:
1、當(dāng)引用資源時(shí),選擇StaticResource還是DynamicResource的考慮因素:
(1)在哪里創(chuàng)建資源?(資源的范圍或?qū)蛹?jí))
a. 資源是在一個(gè)Page/Canvas/Window中?
b. 在應(yīng)用程序范圍中?
c. 在松散的Xaml中?
d. 在某個(gè)特定的Object(比如某個(gè)特定的Button)中?
物件級(jí):此時(shí),資源只能套用在這個(gè)Object物件,或套用至該物件的子物件。
文件級(jí):如果將資源定義在Window或Page層級(jí)的XAML檔中,那么可以套用到這個(gè)文件中的所有物件。
應(yīng)用程序級(jí):如果我們將資源定義在App.xaml 中,那么,就可以將資源套用到應(yīng)用程序內(nèi)的任何地方。
字典級(jí):當(dāng)我們把資源封裝成一個(gè)資源字典, 定義到一個(gè)ResourceDictionary的XAML文件時(shí),就可以在另一個(gè)應(yīng)用程序中重復(fù)使用。
(2) 應(yīng)用程序的功能:是否在運(yùn)行時(shí)改變資源?
如果需要改變,則使用DynamicResource。
(3) 每個(gè)資源引用類型不同的尋找行為。(需要支持向前引用嗎?)
StaticResources的適用場合:
(1)在資源第一次引用之后無需再修改資源的值。
(2)資源引用不會(huì)基于運(yùn)行時(shí)的行為進(jìn)行重新計(jì)算,比如在重新加載Page/Window的時(shí)候。
(3)當(dāng)需要設(shè)置的屬性不是DependencyObject或Freezable類型的時(shí)候,用StaticResource。
(4)當(dāng)需要將資源編譯到dll中,并打包為程序的一部份,或者希望在各應(yīng)用程序之間共享時(shí),也使用StaticResource。
(5)當(dāng)需要為一個(gè)自定義控件創(chuàng)建一個(gè)Theme,并Theme中使用資源,就需要使用StaticResource。因?yàn)镾taticResource的資源查找行為時(shí)可預(yù)測的,并且本身包含在Theme中。而對(duì)于DynamicResource,即使資源是定義在Theme中,也只能等到運(yùn)行時(shí)確定,導(dǎo)致一些可能意料不到的情況發(fā)生。
(6)當(dāng)需要使用資源設(shè)置大量的依賴屬性(Dependency Property)的時(shí)候。
由于依賴屬性具有屬性系統(tǒng)提供的值緩存機(jī)制,所以,如果能在程序裝載時(shí)設(shè)置依賴屬性的值,這樣,依賴屬性就不需要檢查自己的值并返回最后的有效值了。
Dynamic Resource一般使用在如下場合:
(1)資源的值依賴一些條件,而該條件直到運(yùn)行時(shí)才能確定。
包括系統(tǒng)資源,或是用戶可設(shè)置的資源。比如:可以創(chuàng)建引用系統(tǒng)屬性諸如SystemColors,SystemFonts來設(shè)置值,而這些屬性是動(dòng)態(tài)的,它們的值又來自于運(yùn)行環(huán)境和操作系統(tǒng)。
(2)為自定義控件引用或創(chuàng)建Theme Style。
(3)希望在程序運(yùn)行期間調(diào)整資源字典的內(nèi)容時(shí)。
(4)希望資源可以向前引用時(shí)(如上面在Canvas中引用innerLgbResource一樣)
(5)資源文件很大,希望在運(yùn)行時(shí)才加載。
(6)要?jiǎng)?chuàng)建的Style的值可能來自于其它值,而這些值又依賴于Theme或用戶的設(shè)置。
(7)當(dāng)引用資源的元素的父元素有可能在運(yùn)行期改變,這個(gè)時(shí)候也需要使用動(dòng)態(tài)資源。因?yàn)楦冈氐母淖儗?dǎo)致資源查詢的范圍。
Dynamic resource的限制條件:屬性必須是依賴屬性,或是Freezable的。
資源的查詢方式
Static Resource的查詢
(1)查找使用該資源的元素的Resource字典;
(2)順著邏輯樹向上查找父元素的資源字典,直到根節(jié)點(diǎn);
(3)查找Application資源;
(4)不支持向前引用,即:不能引用在引用點(diǎn)之后才定義的資源。
Dynamic Resource的查詢
(1)查找使用該資源的元素的Resource字典;
如果元素定義了一個(gè)Style 屬性,將查找Style中的資源字典;如果元素定義了一個(gè)Template屬性,將查找FrameworkTemplate中的資源字典。
(2)順邏輯樹向上查找父元素的資源字典,直到根節(jié)點(diǎn);
(3)查找Application資源;
(4)查找當(dāng)前激活狀態(tài)下的Theme資源字典;
(5)查找系統(tǒng)資源。
?
參考
用實(shí)例講DynamicResource與StaticResource的區(qū)別
轉(zhuǎn)載于:https://www.cnblogs.com/HQFZ/p/4205830.html
總結(jié)
以上是生活随笔為你收集整理的[WPF系列]-DynamicResource与StaticResource的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MFC】BitBlt详解
- 下一篇: 没有事业的女朋友(一个老总的感言)