原文:
StaticResource和DynamicResourceDynamicResource與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的