WPF中的資源
阿新 • • 發佈:2021-08-28
一、資源概述
資源分為程式資源(二進位制資源或程式集資源,是應用程式的內嵌資源)和物件資源(又稱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);