一、资源概述
资源分为程序资源(二进制资源或程序集资源,是应用程序的内嵌资源)和对象资源(又称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);