什么叫WPF的資源(Resource)?
資源是保存在可執行文件中的一種不可執行數據。在WPF的資源中,幾乎可以包含圖像、字符串等所有的任意CLR對象,只要對象有一個默認的構造函數和獨立的屬性。也就是說,應用程序中非程序代碼的內容,比如點陣圖、顏色、字型、動畫/影片檔以及字符串常量值,可將它們從程序中獨立出來,單獨包裝成"資源(Resource)"。
使用資源的優勢:
1. 由於不用寫在程序代碼中,方便管理:便於更新。
2. 優化資源,節省空間。資源一旦定義,便可重復利用。還記得FLASH中的將物體轉換為元件嗎?一旦將物體轉換為元件,就可以重復利用了。在WPF中,似乎與之有共通之處。所不同的是,WPF將資源保存在XAML中,對我們而言是“可見的”。
一個簡單的資源使用示例:
<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>
<Style TargetType="TextBlock" x:Key="Label">
<Setter Property="DockPanel.Dock" Value="Right"/>
<Setter Property="FontSize" Value="8"/>
<Setter Property="Foreground" Value="{StaticResource MyBrush}"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Margin" Value="0,3,10,0"/>
</Style>
</Page.Resources>
<StackPanel>
<Border Style="{StaticResource PageBackground}">
<DockPanel>
<TextBlock Style="{StaticResource Label}">Label</TextBlock>
<Button DockPanel.Dock="Top" HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
<Ellipse DockPanel.Dock="Top" HorizontalAlignment="Left" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="40" />
</DockPanel>
</Border>
</StackPanel>
</Page>
上例中,我們使用了靜態資源(Static Resource),如有需要,我們也可以使用動態資源(Dynamic Resources)。這兩者的區別是:靜態資源在第一次編譯后即確定其對象或值,之后不能對其進行修改。動態資源則是在運行時決定,當運行過程中真正需要時,才到資源目標中查找其值。因此,我們可以動態地修改它。由於動態資源的運行時才能確定其值,因此效率比靜態資源要低。需要說明的是,資源不僅可以在XAML代碼中訪問,也可以使用C#代碼訪問和控制它們。方法是使用FindResource查找資源,Resource.Add增加資源和Resource.Remove(移除資源)。
資源的范圍(層級):
WPF提供一個封裝和存取資源(resource)的機制,我們可將資源建立在應用程序的不同范圍上。WPF中,資源定義的位置決定了該資源的可用范圍。資源可以定義在如下范圍中:
(1)物件級:此時,資源只能套用在這個Object物件,或套用至該物件的子物件。
(2)文件級:如果將資源定義在Window或Page層級的XAML檔中,那么可以套用到這個文件中的所有物件。
(3)應用程序級:如果我們將資源定義在App.xaml 中,那么,就可以將資源套用到應用程序內的任何地方。
(4)字典級:當我們把資源封裝成一個資源字典, 定義到一個ResourceDictionary的XAML文件時,就可以在另一個應用程序中重復使用。
| 資源層級 |
定義范圍 |
使用范圍 |
| 物件級 |
|
只能套用在這個Object物件或其子物件中 |
| 文件級 |
Window或Page層級的XAML檔中 |
可套用到這個文件中的所有物件,如< Window.Resources > |
| 應用程序級 |
App.xaml文檔中 |
套用到應用程序內的任何地方。 |
| 字典級 |
把資源封裝成一個資源字典, 定義到ResourceDictionary的XAML文件中 |
可以在另一個應用程序中重復使用。 |
資源的查詢方式
Static Resource的查詢
(1)查找使用該資源的元素的Resource字典;
(2)順着邏輯樹向上查找父元素的資源字典,直到根節點;
(3)查找Application資源;
(4)不支持向前引用,即:不能引用在引用點之后才定義的資源。
Dynamic Resource的查詢
(1)查找使用該資源的元素的Resource字典;
如果元素定義了一個Style 屬性,將查找Style中的資源字典;如果元素定義了一個Template屬性,將查找FrameworkTemplate中的資源字典。
(2)順邏輯樹向上查找父元素的資源字典,直到根節點;
(3)查找Application資源;
(4)查找當前激活狀態下的Theme資源字典;
(5)查找系統資源。
