WPF中的資源

什麼叫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文件時,就可以在另一個應用程序中重複使用。

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

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

(5)查找系統資源
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章