使用资源的方式有两种:静态方式和动态方式。静态资源使用(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不会再去访问该资源;动态资源使用(DynamicResource)指的是在程序运行过程中仍然会去访问的资源。示例如下:
XAML代码:
<Window x:Class="MyTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyTest"
Title="WPF" Height="205" Width="250">
<Window.Resources>
<TextBlock x:Key="res1" Text="海上生明月"/>
<TextBlock x:Key="res2" Text="海上生明月"/>
</Window.Resources>
<StackPanel>
<Button Margin="5, 5, 5, 0" Content="{StaticResource ResourceKey=res1}"/>
<Button Margin="5, 5, 5, 0" Content="{DynamicResource ResourceKey=res2}"/>
<Button Margin="5, 5, 5, 0" Content="Update" Click="Button_Click"/>
</StackPanel>
</Window>
C#代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Resources["res1"] = new TextBlock { Text = "天涯共此时" };
this.Resources["res2"] = new TextBlock { Text = "天涯共此时" };
}
}
======================================================================
资源文件在目标文件里以二进制数据的形式存在、形成目标文件的资源段(Resource Section),使用时数据会被提取出来,为应用程序内嵌资源;称资源词典里的资源为"WPF资源"或“对象资源”,称应用程序的内嵌资源为“程序集资源”或“二进制资源”。特别提醒一点,WPF程序中写在<Application.Resources>...</Application.Resources>标签内的资源仍然是WPF资源而非二进制资源。
若要添加的资源是字符串而非文件,可使用Properties名称空间中的Resources.resx资源文件。Resources.resx文件内容的组织形式也是“键--值”对,编译后,Resources.resx会形成Prperties名称空间中的Resources类,使用这个类的方法或属性就能获得资源。为了让XAML编译器能够访问这个类,一定要把Resources.resx的访问级别由Internal改为Public。在XAML代码中使用Resources.resx中的资源,先要把程序的Properties名称空间映射为XAML名称空间,然后使用x:Static标签扩展来访问资源。示例如下:
XAML代码:
<Window x:Class="MyTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyTest"
xmlns:prop="clr-namespace:MyTest.Properties"
Title="WPF" Height="205" Width="250">
<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>
</Window>
C#代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.textBlockPassword.Text = Properties.Resources.Password;
}
}
使用Resources.resx最大的好处就是便于程序的国际化、本地化。
在WPF中使用外部文件作为资源,仅需简单地将其加入项目即可。注意:如果想让外部文件编译进目标成为二进制资源,必须在属性窗口中把文件的BuildAction属性值设为Resource。
WPF对二进制资源的访问有自己的一套方法,称为Pack URI路径,格式:
pack://application,,,[程序集名称;][可选版本号;][文件夹名称/]文件名称。
常用格式如下:
[文件夹名称/]文件名称