WPF 应用程序资源、内容和数据文件

 

具体见MSDN: https://msdn.microsoft.com/zh-cn/library/aa970494.aspx

Microsoft Windows 应用程序通常依赖包含不可执行数据的文件,如可扩展应用程序标记语言 (XAML)、图像、视频和音频。 Windows Presentation Foundation (WPF) 为配置、识别和使用这些类型的数据文件(称为应用程序数据文件)提供了特殊支持。 这种支持主要针对一组特定的应用程序数据文件类型,包括:

  • 资源文件:编译到可执行或库 WPF 程序集中的数据文件。

  • 内容文件:与可执行 WPF 程序集具有显式关联的独立数据文件。

  • 源站点文件:与可执行 WPF 程序集没有关联的独立数据文件。

这三种类型的文件之间的一个重要区别是:资源文件和内容文件在生成时是已知的;程序集明确地知道它们的存在。 但是对于源站点文件,程序集可能完全不知道它们,或者通过 pack 统一资源标识符 (URI) 引用知道它们的存在;在后一种情况下,不能保证被引用的源站点文件实际存在。

为了引用应用程序数据文件,Windows Presentation Foundation (WPF) 使用 Pack 统一资源标识符 (URI) 方案,这将在 WPF 中的 Pack URI中详细介绍。

 

1.资源文件

如果应用程序数据文件必须始终可供某个应用程序使用,那么保证可用性的唯一方法是将其编译到应用程序的主可执行程序集中,或者它所引用的程序集中。 这种类型的应用程序数据文件称为“资源文件”

在 Microsoft Visual Studio 中,可通过将一个文件添加到项目并将其 Build Action(生成操作) 设置为 Resource 来创建资源文件。

Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetResourceStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;
等效
Uri pageUri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
this.pageFrame.Source = pageUri;
等效
<Frame Name="pageFrame" Source="PageResourceFile.xaml" />

 

2.内容文件

内容文件是作为松散文件与可执行程序集一起分发的。 虽然它们不编译到程序集中,但编译程序集时所使用的元数据建立了与每个内容文件的关联。

如果应用程序需要一组特定的应用程序数据文件,并且您希望能够更新这些文件,而无需重新编译使用它们的程序集,则应该使用内容文件

若要将内容文件添加到项目中,必须在 Content 项中包含一个应用程序数据文件。 此外,因为内容文件不直接编译到程序集中,所以需要设置 MSBuild CopyToOutputDirectory 元数据元素,以指定将内容文件复制到一个相对于生成的程序集的位置。 如果希望在每次生成项目时都将资源复制到生成输出文件夹,可将 CopyToOutputDirectory 元数据元素设置为 Always 值。 否则,可以使用 PreserveNewest 值来确保只有最新版本的资源才会复制到生成输出文件夹。

 

在 Visual Studio 中,可通过将一个文件添加到项目并将其 Build Action 设置为 Content 来创建内容文件,然后将其 Copy to Output Directory 设置为 Copy always(与 Always 相同)和 Copy if newer(与 PreserveNewest 相同)。

 

使用内容文件与使用资源文件的方法一样。

3.源站点文件

资源文件与同其一起分发的程序集有显式关系,这一关系由 AssemblyAssociatedContentFileAttribute 定义。 但是,有些情况下可能需要在程序集和应用程序数据文件之间建立隐式关系或不存在的关系,这些情况包括:

  • 编译时文件不存在。

  • 在运行之前您不知道程序集将需要哪些文件。

  • 您希望能够更新文件,而又无需重新编译与这些文件关联的程序集。

  • 应用程序使用大型数据文件,如音频和视频,并且您希望仅在用户选择下载时才下载这些文件。

在 Visual Studio 中,可通过将一个文件添加到项目,并将其 Build Action 设置为 None 来创建源站点文件。

Uri uri = new Uri("/SiteOfOriginFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetRemoteStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;


 

posted on 2015-01-31 15:12  zsfwh  阅读(487)  评论(0)    收藏  举报