WPF学习之--资源

一、资源概述

资源分为程序资源(二进制资源或程序集资源,是应用程序的内嵌资源,如实际的信息)和对象资源(又称WPF资源,如模板和样式

在资源检索时,先查找控件自己的Resource属性,如果没有这个资源程序会沿着逻辑树向上一级控件查找,如果连顶层容器【Windows,也就是窗口】都没有这个资源,程序就会去查找Application.Resource(程序的顶级资源,放在App.xml中,它的作用范围是项目的所有窗口和用户控件),如果还没有找到就会抛出异常。

假如我有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);

 

posted @ 2021-08-28 20:53  HelloWorld庄先生  阅读(319)  评论(0编辑  收藏  举报