当前位置: 首页 > 编程语言 > .NET综合 > 正文

WPF学习之资源-Resources

时间:2010-07-18 cnblogs zlgcool Allan

WPF通过资源来保存一些可以被重复利用的样式,对象定义以及一些传统的资源如二进制数据,图片等等,而在其支持上也更能体现出这些资源定义的优越性。比如通过ResourceDictionary的支持就可以通过资源来实现换肤功能,在ExpressionBlend中设计的酷炫造型也可以通过导出成资源来很容易的被程序员所引用,本地化的实现,访问另外程序集的嵌入式资源等等。这些都给我们提供了丰富的手段通过资源访问架构来构建丰富的富媒体应用程序。本文简单讲解了WPF Resources的分类及其常见用法,并简单触及用ResourceDictionary来管理多个Resources文件(这是换肤的基础)。

在WPF中的资源不仅依赖于核心.NET的资源系统,在其基础上也添加了对两种不同资源类型的支持:二进制资源和逻辑资源。而对于这些资源类型的构建动作也有了更多的支持选项。

1.二进制资源

二进制资源其实是一些传统的资源项,比如位图,音频文件,视频文件,松散文件(Loose file)等等。对于这些资源项我们可以将其存储为松散文件,或者编译进程序集中。这与传统的.NET程序其实是相通的,但在WPF中提供了两种对二进制资源的构建选项:

· Resource: 将资源放入程序集中(如果是有本地化支持的话会编译到对应语言集的子程序集中。

· Content:将这个资源作为一个松散文件加入到程序集中,程序集会记录对应的文件是否存在及其路径。这就相当于我们web开发中常用的构建动作。

对于MSBuild来说这也是默认的构建类型,例如,

  <Content Include="Images\Go.ico" />
  <Content Include="Images\Go.jpg" />
  <Content Include="Images\Go2.gif" />
  <Content Include="Images\Go2.jpg" />
  <Content Include="Images\information16.png" />
  <Content Include="Images\pass16.png" />
  <Content Include="Images\pass32.png" />
  <Content Include="Images\unknown16.png" />
  <Content Include="Images\warning.gif" />
  <Content Include="Images\warning16.png" />
  <EmbeddedResource Include="LoginForm.resx">
   <SubType>Designer</SubType>
   <DependentUpon>LoginForm.cs</DependentUpon>
  </EmbeddedResource>
  <EmbeddedResource Include="OptionsForm.resx">
   <SubType>Designer</SubType>
   <DependentUpon>OptionsForm.cs</DependentUpon>
  </EmbeddedResource>
  <EmbeddedResource Include="PageHistory.resx">
   <SubType>Designer</SubType>
   <DependentUpon>PageHistory.cs</DependentUpon>
  </EmbeddedResource>

上图所示是一个普通的WinForm应用程序的项目文件,对于添加到其内部的二进制资源文件其默认的构建动作便是Content-表明其作为一个松散文件存储,只要保证其对应路径的文件存在则可以自动加载(而无需再你的打包文件中必须包含)。而你也会看到EmbeddedResource构建动作,这是WinForm的构建动作,它和Resource构建动作很相似,会在程序集中嵌入一个二进制资源,但是WPF中因为嵌入式资源比WPF还要优先,所以需要尽量避免使用。

之所以推荐使用Resource和Content构建类型是因为这样嵌入的资源可以很容易的在XAML中被引用,而且对于WPF的统一资源识别符也是专门针对这两种构建动作而设计的。相反地,对于EmbeddedResource构建动作嵌入的资源是不能在XAML中被引用的,除非自定义代码。