WPF教程(五)資源(StaticResource 靜態資源、DynamicResource 動態資源)(轉)

WPF教程(五)資源(StaticResource 靜態資源、DynamicResource 動態資源)

(一)基礎知識html

靜態資源(Static Resource),動態資源(Dynamic Resources)。這二者的區別是:靜態資源在第一次編譯後即肯定其對象或值,以後不能對其進行修改。動態資源則是在運行時決定,當運行過程當中真正須要時,纔到資源目標中查找其值。所以,咱們能夠動態地修改它。因爲動態資源的運行時才能肯定其值,所以效率比靜態資源要低。緩存

動態修改,是兩種資源最顯著的差別,也是極其重要的知識點,下面這個例子就是最好的說明,簡單但能解決問題。函數

  1.  
    <Window x:Class= "StaticDynamicResources.MainWindow"
  2.  
    xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.  
    xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml"
  4.  
    xmlns:sys= "clr-namespace:System;assembly=mscorlib"
  5.  
    Title= "MainWindow" Height="350" Width="525">
  6.  
    <Window.Resources>
  7.  
    <sys:String x:Key= "Content" >
  8.  
    Hello World!
  9.  
    </sys:String>
  10.  
    </Window.Resources>
  11.  
    <Grid>
  12.  
    <WrapPanel>
  13.  
    <TextBlock Text= "靜態"/>
  14.  
    <TextBox Text= "{StaticResource Content}" Width="100" x:Name="TextBox1"/>
  15.  
    <TextBlock Text= "動態" Margin="10,0,0,0"/>
  16.  
    <TextBox Text= "{DynamicResource Content}" Width="100" x:Name="TextBox2"/>
  17.  
    <Button Content= "改變資源值" Click="ChangeBtn_Click" Width="100"/>
  18.  
    </WrapPanel>
  19.  
    </Grid>
  20.  
    </Window>
  1.  
    private void ChangeBtn_Click(object sender, RoutedEventArgs e)
  2.  
    {
  3.  
    this.Resources["Content"] = "內容變了";
  4.  
    }

咱們點擊Button發現,後面的TextBox值能夠發生變化,由於它用是的動態資源。有趣的是,將上述程序Window.Resources放在獲取資源後面,會出現錯誤將會收到錯誤提示:「StaticResource reference 'content' was not found.」post

出現此問題的緣由是:StaticResource 查詢行爲不支持向後引用,即不能引用在引用點以後才定義的資源。而DynamicResource能夠向後引用,即DynamicResource運行時才查找並加載所定義的資源。動畫

(二) 運用場合this

StaticResources的適用場合:
(1)在資源第一次引用以後無需再修改資源的值。
(2)資源引用不會基於運行時的行爲進行從新計算,好比在從新加載Page/Window的時候。
(3)當須要設置的屬性不是DependencyObject或Freezable類型的時候,用StaticResource。
(4)當須要將資源編譯到dll中,並打包爲程序的一部份,或者但願在各應用程序之間共享時,也使用StaticResource。
(5)當須要爲一個自定義控件建立一個Theme,並Theme中使用資源,就須要使用StaticResource。由於StaticResource的資源查找行爲時可預測的,而且自己包含在Theme中。而對於DynamicResource,即便資源是定義在Theme中,也只能等到運行時肯定,致使一些可能意料不到的狀況發生。
(6)當須要使用資源設置大量的依賴屬性(Dependency Property)的時候。spa

因爲依賴屬性具備屬性系統提供的值緩存機制,因此,若是能在程序裝載時設置依賴屬性的值,這樣,依賴屬性就不須要檢查本身的值並返回最後的有效值了。操作系統

 Dynamic Resource通常使用在以下場合:
(1)資源的值依賴一些條件,而該條件直到運行時才能肯定。
包括系統資源,或是用戶可設置的資源。好比:能夠建立引用系統屬性諸如SystemColors,SystemFonts來設置值,而這些屬性是動態的,它們的值又來自於運行環境和操做系統。
(2)爲自定義控件引用或建立Theme Style。
(3)但願在程序運行期間調整資源字典的內容時。
(4)但願資源能夠向前引用時(如上面在WrapPanel中引用content同樣)
(5)資源文件很大,但願在運行時才加載。
(6)要建立的Style的值可能來自於其它值,而這些值又依賴於Theme或用戶的設置。
(7)當引用資源的元素的父元素有可能在運行期改變,這個時候也須要使用動態資源。由於父元素的改變將致使資源查詢的範圍。
Dynamic resource的限制條件:屬性必須是依賴屬性,或是Freezable的。.net

(三)查詢方式code

Static Resource的查詢方式
(1)查找使用該資源的元素的Resource字典;
(2)順着邏輯樹向上查找父元素的資源字典,直到根節點;
(3)查找Application資源;
(4)不支持向前引用,即:不能引用在引用點以後才定義的資源。

Dynamic Resource的查詢
(1)查找使用該資源的元素的Resource字典;
若是元素定義了一個Style 屬性,將查找Style中的資源字典;若是元素定義了一個Template屬性,將查找FrameworkTemplate中的資源字典。
(2)順邏輯樹向上查找父元素的資源字典,直到根節點;
(3)查找Application資源;
(4)查找當前激活狀態下的Theme資源字典;
(5)查找系統資源。

總結

資源是保存在可執行文件中的一種不可執行數據。在WPF的資源中,幾乎能夠包含圖像、字符串等全部的任意CLR對象,只要對象有一個默認的構造函數和獨立的屬性。

也就是說,應用程序中非程序代碼的內容,好比點陣圖、顏色、字型、動畫/影片檔以及字符串常量值,可將它們從程序中獨立出來,單獨包裝成"資源(Resource)",上面面程序中字符串就是利用這種方法。