1. 程式人生 > 其它 >WPF中的資源

WPF中的資源

一、資源概述

資源分為程式資源(二進位制資源或程式集資源,是應用程式的內嵌資源)和物件資源(又稱WPF資源,是資源詞典內的資源,如模板,程式樣式和主題)

在資源檢索時,先查詢控制元件自己的Resource屬性,如果沒有這個資源程式會沿著邏輯樹向上一級控制元件查詢,如果連頂層容器都沒有這個資源,程式就會去查詢Application.Resource(程式的頂級資源),如果還沒有找到就會丟擲異常。

假如我有x:key="TextBoxDic"的資源,也可以在程式中直接使用。

      private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
this.textBox1.Style = (Style)this.FindResource("TextBoxDic"); }

具體的使用過程可以參考一篇部落格WPF何如在後臺通過程式碼建立控制元件,如何使用資源樣式

二、動態資源和靜態資源

靜態資源(StaticResource):指的是在程式載入記憶體時對資源的一次性使用,之後就不在訪問這個資源。

動態資源(DynamicResource):指的是在程式執行過程中仍然會去訪問資源。

<Window.Resource>
    <TextBlock x:key="res1" Text="海上生明月"/>
    <TextBlock x:key="
res2" Text="海上生明月"/> </Window.Resource> <StackPanel> <Button x:Name="Button2"content="{StaticReource res1}"/>
   <Button x:Name="Button2" content="{DynamicResource res2}"/>
</StackPanel>

private void Button_Click(object sender,RoutedEventArg e)
{
  
this.Resource["res1"
]=new TextBlock(){Text="123"};
this.Resource["res2"]=new TextBlock(){Text="123"};
}

Button2會變。

三、向程式中新增二進位制資源

在應用程式Properties名稱空間中的Resource.resx資原始檔中。需要把Resources.resx的訪問級別由Internal改為Public

在XAML程式碼中使用Resource.resx中的資源,先把程式的Properties名稱空間對映為XAML名稱空間,然後使用x:Static標籤擴充套件來訪資源。

需要新增的字串資源如下,假如我在Resource.resx加的是UserName:

<Window

    xmlns:prop="clrnamespace:***.Properties">

<TextBox Text="x:Static prop:Resources.UserName/>

</Windows>

使用Resource.resx的最大好處是便於程式的國際化和本地化。

四、使用Pack URI路徑訪問二進位制資源

固定格式

pack://application,,,[/程式集名稱;][可選版本號;][資料夾名稱/]檔名稱
“//application,,,”可以省略,“/程式集名稱,可選版本號”可以使用預設值
<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />

            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

與之等價的C#程式碼

Uri imageUri=new Uri(@"Resource/Images/flag.jpg",UriKind.Relative);//相對路徑使用
this.image.Source=new BitmapImage(imageUri);

Uri imageUri=new Uri(@"pack://application:,,,/Resource/Images/flag.jpg",UriKind.Absolute);//絕對路徑使用
this.image.Source=new BitmapImage(imageUri);