天天看點

StaticResource和DynamicResource

原文:

StaticResource和DynamicResource

DynamicResource與StaticResource的差別

資源的使用

下面的示例在page的根元素定義了一個SolidColorBrush畫刷作為一個資源,并展示如何用它來設定Page中子元素的屬性

<Page Name="root"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

<Page.Resources>

    <SolidColorBrush x:key=”MyBrush” Color=”Gold”/>

    <Style TargetType=”Border” x:Key=”PageBackground”>

       <Setter Property=”Background” Value=”Blue”/>

    </Style>

    <SolidColorBrush x:Key="MyBrush" Color="Gold"/>

    <Style TargetType="Border" x:Key="PageBackground">

      <Setter Property="Background" Value="Blue"/>

</Page.Resources>

 <StackPanel>

    <DockPanel>

        <Button DockPanel.Dock="Top" HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>

              </DockPanel>

 </StackPanel>

</Page>

每個架構級别的元素(FrameworkElement或FrameworkContentElement)都有一個Resources屬性,我們可以在任何元素上定義資源,不過習慣上在根元素上定義,如上面 的xmal代碼中<Page.Resources/>定義資源。

       通過屬性x:Key給每個資源賦予一個唯一的關鍵字。這樣我們就可以在Xmal的其它地方通過Key值來操作對應的資源了。如下示例,使用資源給元素的屬性指派

<Button Background=”{StaticResource MyBrush}” />

StaticResource 和DynamicResource

資源可以被當作StaticResource和DynamicResource兩種類型來引用。

當引用資源時,下面的考慮将影響你是選擇StaticResource還是DynamicResource來它。

1〉 如何為應用程式建立資源(資源是在一個Page中,在APP範圍還是在松散的Xaml中或僅僅在程式集中)

2〉 應用程式功能:是否在運作時改變資源

3〉 每個資源引用類型不同的尋找行為

StaticResources

StaticResources在如下情況下使用比較好

1〉 在資源第一次引用之後無需再修改資源的值

2〉 StaticResource引用不會基于運作時的行為進行重新計算。比如在重新加載Page的時候。

3〉 當需要設定的屬性不是DependencyObject或Freezable類型的時候,需要用staticResource

4〉 當需要将資源編譯到dll中,并打包為程式的一部份,或者希望在各應用程式之間共享

5〉 當需要為一個自定義控件建立一個theme,并theme中使用資源,就需要使用StaticResource。因為StaticResource的資源查找行為時可預測的,并且本身包含在theme中。而對于DynamicResource,即使資源是定義在theme中,也隻能等到運作時确定,導緻一些可能意料不到的情況發生。

6〉 當需要使用資源設定大量的依賴屬性的時候(dependency property),依賴屬性具有屬性系統提供的值緩存機制,是以如果能在程式裝載時設定依賴屬性的值,依賴屬性就不需要檢查自己的值并傳回最後的有效值了。可以獲得顯示時的好處。

Static resource 查詢行為

1〉 查找使用該資源的元素的resource字典

2〉 順邏輯樹向上查找父元素的資源字典,直到根節點

3〉 查找Application資源

4〉 不支援向前引用。即不能引用在引用點之後才定義的資源

Dynamic Resource

Dynamic resources一般使用在如下場合

1〉 資源的值依賴一些條件,而該條件直到運作時才能确定。這包括系統資源,或是使用者可設定的資源。例如,可以建立引用系統屬性諸如SystemColors,SystemFonts來設定值,這些屬性是動态的,他們的值來自于運作環境和作業系統

2〉 為自定義控件引用或建立theme style

3〉 希望在程式運作期間調整資源字典的内容

4〉 希望資源可以向前引用

5〉 資源檔案很大,希望在運作時加載

6〉 要建立的style的值可能來自于其它值,而這些值又依賴于themes或使用者設定

7〉 當引用資源的元素的父元素有可能在運作期改變,這個時候也需要使用動态資源。因為父元素的改變将導緻資源查詢的範圍。

Dynamic resource 查詢行為

如果元素定義了一個Style 屬性,将查找Style中的資源字典

如果元素定義了一個Template屬性,将查找FrameworkTemplate中的資源字典

4〉 查找目前激活狀态下的theme資源字典。

5〉 查找系統資源

Dynamic resource的限制條件

1〉 屬性必須是依賴屬性,或是Freezable的

繼續閱讀