[WPF]浅析资源引用(pack URI)

这篇具有很好参考价值的文章主要介绍了[WPF]浅析资源引用(pack URI)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WPF中我们引用资源时常常提到一个概念:pack URI,这是WPF标识和引用资源最常见的方式,但不是唯一的方式。本文将介绍WPF中引用资源的几种方式,并回顾一下pack URI标识引用在不同位置的资源文件的写法。

WPF中引用资源的几种方式

WPF中使用URI标识和加载位于各种位置的文件,包括当前程序集资源文件、其他程序集资源文件、本地磁盘文件、网络共享文件、web站点文件。

程序集资源文件

程序集资源文件是最常见的一种情况。这里程序集资源指的是资源文件属性的生成操作(Build Action)为Resource的文件,而非嵌入的资源(Emmbedded Resource)。程序集中的资源文件通常使用相对URI来引用,例如:

<ImageBrush x:Key="imgbrush" ImageSource="images/111.jpg"/>   //本地程序集中资源引用的写法
<ImageBrush x:Key="imgbrush" ImageSource="/ResourceDll;component/images/111.jpg"/>   //引用的程序集中资源引用的写法

也可以使用绝对Pack URI语法,例如

<ImageBrush x:Key="imgbrush" ImageSource="pack://application:,,,/images/111.jpg"/>     //本地程序集中资源引用的写法
<ImageBrush x:Key="imgbrush" ImageSource="pack://application:,,,/ResourceDll;component/images/111.jpg"/>   //引用的程序集中资源引用的写法

本地磁盘文件

直接引用本地磁盘文件的方式不常见。这种方式引用本地文件会占用文件,本地文件无法修改或者删除,因此不推荐此方式。这里只是举例讲解。

<ImageBrush x:Key="imgbrush" ImageSource="d:\\tmp\\新建文件夹\\123.jpg"/> 

网络共享文件

网络共享文件和本地磁盘文件类似,会占用文件。可以使用UNC或者URI的方式引用。

<ImageBrush x:Key="imgbrush" ImageSource="\\192.168.0.1\tmp\新建文件夹\123.jpg"/>    UNC方式引用
<ImageBrush x:Key="imgbrush" ImageSource="file://192.168.0.1\tmp\新建文件夹\123.jpg"/>    URI方式引用

web站点文件

少数场景下会在WPF中使用web站点资源,比如用户头像。web站点资源主要以http/https协议的url加载,url作为URI的子集,因此可以直接引用。实际开发中不建议直接引用url,因为请求网络资源需要时间,这可能导致UI短暂卡顿。建议开启线程把网络资源读到内存中使用。

<ImageBrush x:Key="imgbrush" ImageSource="https://pic.cnblogs.com/default-avatar.png"/>

上述示例中都是在XAML中声明式的语法引用资源,本质还是使用Uri类,因此在后台代码中使用Uri类就行。

// 绝对URI (默认)
Uri absoluteUri = new Uri("pack://application:,,,/images/111.jpg", UriKind.Absolute);
// 相对URI
Uri relativeUri = new Uri("images/111.jpg", UriKind.Relative);

Pack URI方案

pack URI的语法看起来很奇怪,它是来自开放式打包约定 (OPC)规范中XPS(XML Paper Specification)标准,有使用openxml解析Word/PPT文件经验的朋友可能熟悉这个规范。OPC 规范利用RFC 2396(统一资源标识符 (URI):一般语法)的扩展性来定义pack URI方案。

URI所指定的方案(schemes)由其前缀定义;httpftptelnetfile 是比较常见的协议方案(schemes)。pack URI使用“pack”作为它的方案(schemes),并且包含两个组件:授权和路径。 pack URI的格式为:pack://authority/path。authority指定包含部件的包的类型,而path 指定部件在包内的位置。前边示例代码中application:,,,就是授权(authority),/images/111.jpg或者/ResourceDll;component/images/111.jpg就是路径(path)。这里也可以理解为嵌套在方案(schemes)为pack://的uri中的uri。由于是嵌套在内部的uri,授权(authority)原本应是application:///中的斜杠转义为逗号。路径中必须对保留字符(如“%”和“?”)进行转义。详细信息可参阅开放式打包约定 (OPC)规范

标准的URI协议方案有30种左右,由隶属于国际互联网资源管理的非营利社团 ICANN(Internet Corporation for Assigned Names and Numbers,互联网名称与数字地址分配机构)的 IANA(Internet Assigned Numbers Authority,互联网号码分配局)管理颁布。详细协议方案参见:http://www.iana.org/assignments/uri-schemes

在WPF中,用程序(包)可以包含一个或多个文件(部件),包括:

  • 当前程序集内的资源文件
  • 引用的程序集内的资源文件
  • 内容文件
  • 源站点文件

为了访问这些类型的文件,WPF 支持两种授权:application:///siteoforigin:///[1] application:/// 授权标识在编译时已知的应用程序数据文件,包括资源文件和内容文件。 siteoforigin:/// 授权标识源站点文件。 下图显示了每种授权的范围。

pack URI语法示例

前边提到pack URI由授权和路径组成,当前程序集、引用的程序集内的资源文件,以及内容文件的授权都是application:///,源站点文件的授权是siteoforigin:///(用于XAML浏览器应用程序)。

当前程序集资源文件

当前程序集资源文件的路径是资源文件相对程序集项目文件夹根目录的路径。需要注意的是这里所说的相对于程序集项目文件夹根目录表达的是从哪里开始作为根目录进行寻址,当使用pack://这样绝对URI表示时,路径应该用根目录符号/开始。下图中111.jpg位于项目的根目录,它的pack URI就是:

pack://application:,,,/111.jpg

BlindsShader.ps位于子目录中,它的pack URI就是:

pack://application:,,,/Shader/ShaderSource/BlindsShader.ps

[WPF]浅析资源引用(pack URI)

引用程序集资源文件

当需要引用另一个程序集中的资源文件时,路径需要指明程序集的名称。路径需符合以下的格式:

pack://application:,,,AssemblyShortName{;Version}{;PublicKey};component/ResourceName
  • AssemblyShortName是引用的程序集的短名称,是必选项
  • Version是引用的程序集的版本。此部分在加载两个或多个具有相同短名称的引用程序集时使用,是可选项。
  • PublicKey是引用的程序集的签名公钥。此部分在加载两个或多个具有相同短名称的引用程序集时使用,是可选项。
  • component指定所引用的程序集是从本地程序集引用的,此处是固定写法
  • ResourceName是资源文件的名称,包括其相对于所引用程序集的项目文件夹根目录的路径。

内容文件

前边提到的资源文件都是生成操作(Build Action)为Resource的文件,是会编译到程序集中。内容文件是生成操作(Build Action)为内容(Content)的文件,并不会编译到程序集中,通常是将文件属性中复制到输出目录(CopyToOutputDirectory)选为始终复制(Always)或者如果较新则复制(PreserveNewest),将文件保存到程序运行目录中。内容文件主要可以解决以下问题:

  • 改变资源文件时,需要重新编译应用程序;
  • 资源文件比较大,导致编译的程序集也比较大;
  • WPF声音文类不支持程序集资源,无法从资源流中析取音频文件并播放。

内容文件本质上也是本地磁盘文件,但生成项目时,会将 AssemblyAssociatedContentFileAttribute 属性编译到每个内容文件的程序集的元数据内,AssemblyAssociatedContentFileAttribute 的值表示内容文件相对于其在项目中的位置的路径[2],可以采用pack URI的方式加载。内容文件的路径是其相对于应用程序的主可执行程序集的文件系统位置的路径。其格式如下:

pack://application:,,,/ContentFile.wav

源站点文件

源站点文件主要针对XAML浏览器应用程序(XBAP)设计,编译XAML浏览器应用程序(XBAP)将资源文件分离出程序集,减少文件大小,在需要请求下载源站点文件时,才下载它们到客户端计算机[2:1]。现在基本不使用该技术,本文不再详细介绍,感兴趣可以查看文末参考资料。

参考


  1. https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/app-development/pack-uris-in-wpf?view=netframeworkdesktop-4.8 ↩︎

  2. https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/app-development/wpf-application-resource-content-and-data-files?view=netframeworkdesktop-4.8 ↩︎ ↩︎文章来源地址https://www.toymoban.com/news/detail-745949.html

到了这里,关于[WPF]浅析资源引用(pack URI)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [UE C++] 资源加载(一) 硬&软引用加载资源

    路径名如何获取 对于对象资源,右键 Copy Reference 对于类资源,右键 Copy Reference 然后加上 _C 图片来自于 数据驱动开发 概念: 使用硬引用加载方式,当对象A引用对象B,会导致对象B直接被加载到内存当中。若对象B同时硬引用了对象C,那么对象C也会被加载到内存中,这一过程

    2024年02月08日
    浏览(39)
  • 【WPF.NET开发】WPF中的XAML资源

    使用 XAML 中的资源 静态和动态资源 静态资源 动态资源 样式、DataTemplate 和隐式键 资源是可以在应用中的不同位置重复使用的对象。 资源的示例包括画笔和样式。 本概述介绍如何使用 Extensible Application Markup Language (XAML) 中的资源。 你还可以使用代码创建和访问资源。  备注

    2024年01月17日
    浏览(62)
  • C#WPF动态资源和静态资源应用实例

    本文实例演示C#WPF动态资源和静态资源应用 静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了。 动态资源(DynamicResource)指的是在程序运行过程中然会去访问资源。 WPF中,每个界面元素都含有一个名为Resources的属性,其存储的是以

    2024年02月07日
    浏览(36)
  • ChatGPT会如何影响我们的工作生活和人力资源需求

    ChatGPT,这几天体验了一下,确实是非常震撼。   一方面是因为它的回答确实相当好,自带一点框架逻辑,有上下文理解能力,可以追问,有情商。虽然很多时候都是一些正确的废话 它还有媲美一个普通大学生的信息整合能力,并且一秒钟就能回答你,它甚至还会写代码  

    2024年02月03日
    浏览(48)
  • WPF之资源规划

    本文主要介绍WPF资源的规划,通过规划如何使得我们的样式可以有高效的复用,以及在应对需求的改动(如换主题,或整体字体,颜色切换)的时候我们可以做到代码改动最小化。 资源规划总的原则就是: 代码,资源最大化的复用 代码可以做到以最小化的改动应对最大化的

    2024年02月22日
    浏览(35)
  • wpf的资源路径

    1、手动命名空间 xmlns:share=\\\"clr-namespace:***;assembly=**\\\" 2、资源文件 Pack URI 编译到本地程序集内的资源文件的 pack URI 使用以下授权和路径: 授权 :application:///。 路径 :资源文件的名称,包括其相对于本地程序集项目文件夹根目录的路径 pack://application:,,,/ResourceFile.xaml pack://app

    2024年02月01日
    浏览(36)
  • wpf CommunityToolkit.Mvvm8.1 MVVM工具包安装引用指南

      本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html     0.说明 CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm)是一个现代、快速且模块化的 MVVM 库。 它支持:.NET Standard 2.0、 .NET Standard 2.1 和 .NET 6(UI Framework 不支持)   文档地址: https://learn.microsoft.com/z

    2023年04月08日
    浏览(40)
  • (六)WPF - 资源和样式行为(1)

    1、资源集合 每个元素都有一个 Resources 属性,该属性存储了一个资源字典集合(它是 Resource Dictionary 类的实例)。资源集合可以包含任意类型的对象,并根据字符串编写索引。 为了使用 XML 标记中的资源,需要一种引用资源的方法。这是通过标记扩展完成的。 有两个标记扩

    2024年02月10日
    浏览(41)
  • wpf数据绑定之元素、资源、后台绑定

            wpf前端的数据绑定主要分为元素、资源以及后台数据三种,元素可以简单的理解为前端的空间数据绑定,资源是在resource里找数据,而后台就是跟cs文件之间的数据互相传递。           先说下元素吧,也就是控件元素,因为代码比较简单,就不上效果了,自己可以

    2024年02月04日
    浏览(58)
  • 微信小程序主包和分包资源相互引用规则

    微信分包文档   文档中只提到了分包对于兄弟分包和主包之间的引用关系,但是并未提及,主包是否可以引用分包资源。其实只需要明白两点, 第一点:分包永远都是异步加载的 第二点:主包可以预加载分包 那么其实这里就已经很明显了,如果想要主包使用分包的资源,那

    2024年01月21日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包