WPF资源

WPF程序中数据就分为四个等级存储:数据库里的数据,资源文件里的数据,WPF对象里的数据,变量中的数据。

一、WPF对象级资源的定义与查找
每个WPF的界面元素都具有一个名为Resources的属性,这个属性继承自FrameworkElement类,其类型为ResourceDictionary。ResourceDictionary能够以“键-值”对的形式存储资源。在保存资源时,ResourceDictionary视资源对象为object类型,所以在使用资源时要进行数据转换,XAML编译器能够根据Attribute自动识别资源类型,但是在c#代码里检索到资源对象后,类型转换需要手动完成。
ResourceDictionary可以存储任意类型对象,在XAML代码中向Resource添加资源时需要引入名称空间。

xmlns:sys="clr-namespace:System;assembly=mscorlib"
<Window.Resources>
    <!--下面<ResourceDictionary></ResourceDictionary>标签可以省略-->
    <ResourceDictionary>
        <sys:String x:Key="str">
            沉舟侧畔千帆过,病树前头万木春。
        </sys:String>
        <sys:Double x:Key="dbl">3.1415926</sys:Double>
    </ResourceDictionary>
</Window.Resources>
    <StackPanel>
        <TextBlock Text="{StaticResource ResourceKey=str}" Margin="5" />
        <TextBlock x:Name="txtBlock1" Margin="5" />
        <!--下面一句代码,因为数据类型不匹配而抛出异常-->
        <!--<TextBlock Text="{StaticResource ResourceKey=dbl}" />-->
    </StackPanel>

等价的c#代码

public WinMain10_1()
{
    InitializeComponent();

    string text = (string)this.FindResource("str");
    //string text1 = (string)this.Resources["str"];   //使用资源字典
    this.txtBlock1.Text = text;
}

也可以更快漂亮的皮肤

<Window.Resources>
    <ResourceDictionary Source="ShinyRed.xaml"/>
</Window.Resources>

二、“静”“动”资源
当资源被存储进资源字典后,我们可以通过两种方式来使用资源——静态方式和动态方式。Static(程序的非执行状态)和Dynamic(程序的运行状态)。
下面看一个例子:

<Window.Resources>
    <TextBlock x:Key="res1" Text="海上生明月" />
    <TextBlock x:Key="res2" Text="海上生明月" />
</Window.Resources>

<StackPanel>
    <Button Margin="5,5,5,0" Content="{StaticResource res1}" />
    <Button Margin="5,5,5,0" Content="{DynamicResource res2}" />
    <Button Margin="5,5,5,0" Content="Update" Click="Button_Click" />
</StackPanel>

界面上第三个按钮负责对两个资源文件进行更改:

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.Resources["res1"] = new TextBlock() { Text = "天涯共此时" };
    this.Resources["res2"] = new TextBlock() { Text = "天涯共此时" };
}

这里写图片描述

三、向程序添加二进制资源
资源词典里的资源称为“WPF资源”或“对象资源”,程序内嵌的资源称为“程序集资源”或“二进制资源”。
1、向WPF程序里添加资源是字符串
我们可以使用程序Properties名称空间中的Resources.resx资源文件。

xmlns:prop="clr-namespace:WpfWindows10.Properties"

这里写图片描述
引用部分代码:

Grid Margin="5">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="4" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="23" />
        <RowDefinition Height="4" />
        <RowDefinition Height="23" />
    </Grid.RowDefinitions>
    <TextBlock Text="{x:Static prop:Resources.UserName}" />
    <TextBlock x:Name="textBlockPassword" Grid.Row="2" />
    <TextBox BorderBrush="Black" Grid.Column="2" />
    <TextBox BorderBrush="Black" Grid.Column="2" Grid.Row="2" />
</Grid>

一个在XAML中引用,一个在c#中引用,c#部分代码:

public WinMain10_3()
{
    InitializeComponent();
    this.textBlockPassword.Text = Properties.Resources.Password;
}

使用Resources.resx最大好处就是便于程序的国际化、本地化
2、引用图标、图片或音乐等其他文件。可以直接放到项目当中。
注意:
如果想让外部文件编译进目标成为二进制资源,必须在属性窗口中把文件的Build Action属性值设为Resource。

四、使用Pack URI路径访问二进制资源:
访问二进制资源,在WPF中称为Pack URI路径。格式:
这里写图片描述

把一张图片当做背景图片:

<Grid>
    <Image x:Name="ImageBg"
            Source="Resources/Image/Aodi.jpg"
            Stretch="Fill" />
</Grid>

与之等效的c#代码

public WinMain10_4()
{
    InitializeComponent();

    Uri imgUri = new Uri(@"Resources/Image/Aodi.jpg", UriKind.Relative);
    //Uri imgUri = new Uri(@"D:/test/a.jpg", UriKind.Absolute);
    this.ImageBg.Source = new BitmapImage(imgUri);
}

效果图:
这里写图片描述

在使用Pack URI路径时有几点注意:
1、Pack URI使用(/)表示路径。
2、使用缩写路径意味着是相对路径,c#代码中UriKind必须为Relative而且代表根目录的/可以省略。
3、使用完整路径写法是觉对路径,c#代码中的UriKind必须为Absolute并且代表根目录的/不能省略。
4、使用相对路径时可以借助类似DOS的语法进行导航,比如./代表同级目录、../代表父级附录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值