WPF包URI中的逗号

17

WPF Pack URIs使用三个连续的逗号,例如:

pack://application:,,,/myFolder/myPic.bmp

这个 ,,, 部分有什么特殊含义吗?它只是作为定界符使用吗?逗号之间可以放置任何内容吗?

2个回答

9

背景

URI方案权限路径1组成。
例如,取此网页的http URL:

https://dev59.com/j2Qo5IYBdhLWcg3wMs0L

scheme    = https://
authority = stackoverflow.com
path      = /questions/16256056/commas-in-wpf-pack-uris

pack URI

对于您的pack URI,也适用同样的规则:

pack://application:,,,/myFolder/myPic.bmp

scheme    = pack://
authority = application:,,,
path      = /myFolder/myPic.bmp

这里不同寻常的是,权限部分由另一个URI的编码表示组成。那个URI看起来像这样:
application:///

scheme    = application://
authority = 
path      = /

它指的是“包” - 具体来说,是当前应用程序的资源文件包。从您已经链接的文档页面中可以了解到: WPF支持两个权限:application:///和siteoforigin:///。application:///权限标识在编译时已知的应用程序数据文件,包括资源和内容文件。siteoforigin:///权限标识源站点文件。
为了作为pack URI的authority组件使用,它需要被编码,以便其斜杠不被误解为pack URI的path组件的一部分。他们选择的编码方式是用逗号替换斜杠。同一文档页面中提到:
注意 pack URI的authority组件是指向包的嵌入式URI,并且必须符合RFC 2396。此外,“/”字符必须替换为“,”字符,并且必须转义保留字符,如“%”和“?”等。有关详细信息,请参见OPC。
1)还可能有一个查询和片段,但这些在此处不相关。

3
这是如何过度设计和复杂化一些实际上应该很简单的事情的典范,即“我想定位一个嵌入或本地资源文件”。这正是为什么WPF是如此痛苦深奥的框架的另一个原因。文档页面似乎甚至没有解释首先需要嵌入式URL的原因。我们可以使用其他嵌入式权限,为什么我们需要那样做?总的来说,这是一个可怕的设计选择,但这是微软,所以也不奇怪。 - Ash
在URI application:///中,为什么机构部分留空,这意味着什么?我想知道。 - IcyBrk

8
您链接的页面中已经有答案了:
  • 权限:application:///
另外,

...此外,斜杠(“/”)必须替换为逗号(“,”)字符,并且必须转义保留字符,例如“%”和“?”。请参阅OPC获取详细信息。

所以,

,,, 部分是否有任何含义?

它是 /// 的替代品。

逗号之间是否可以插入任何内容?

不能。 更正: OPC(开放式封装)链接导向 ECMA-376 ,其中包含以下示例:
pack://http%3c,,www.openxmlformats.org,my.container/a/b/foo.xml
但据我所知,这不适用于 WPF。

它正在解决一个更大的问题,我想期望是为WPF提供更多的工具。但这从未发生过。 - H H
也许如果您知道为什么似乎需要(是否需要?)用,,,替换///,那么您的回答会更具信息量。我必须承认,最近自己也遇到了这个问题,它看起来更像一堆神秘的咒语而不是其他任何东西。 - Kris
1
@Kris: 我知道已经很晚了,但我添加了一个更深入的答案。 - smls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接