【问题标题】:Commas in WPF Pack URIsWPF 包 URI 中的逗号
【发布时间】:2013-04-27 19:28:27
【问题描述】:

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

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

,,, 部分应该意味着什么吗?它只是一个分隔符吗?逗号之间可以有任何内容吗?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    背景

    一个 URI is composed of 一个 schemeauthoritypath1
    例如,取这个网页的http URL:

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

    pack URIs

    这同样适用于您的 pack URI:

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

    这里不同寻常的是,authority 部分由另一个 URI 的编码表示组成。其他 URI 如下所示:

    application:///
    
    scheme    = application://
    authority = 
    path      = /
    

    它指的是一个“包”——具体来说,是指当前应用程序的资源文件包。来自您已链接的documentation page

    WPF 支持两种权限:application:/// 和 siteoforigin:///。 application:/// 权限标识在编译时已知的应用程序数据文件,包括资源和内容文件。 siteoforigin:/// 权限标识源文件的站点。

    为了用作pack URI 的authority 组件,需要对其进行编码,使其斜杠不会被误解为属于路径 pack URI 的组成部分。
    他们选择对其进行编码的方式是用逗号替换斜杠。
    从同一文档页面:

    注意
    包 URI 的授权组件是一个嵌入式 URI,它指向一个包,并且必须符合 RFC 2396。此外,“/”字符必须替换为“,”字符和保留字符,例如“%”和“ ?”必须逃脱。详情请参阅 OPC。


    1) 加上潜在的查询和片段,但这些与此处无关。

    【讨论】:

    • 这是如何过度设计和过度复杂化实际上应该很简单的事情的缩影,即“我想找到一个嵌入式或本地资源文件”。 WPF 是一个如此令人痛苦的神秘框架的另一个原因。文档页面似乎甚至没有首先解释对嵌入式 URL 的需求。我们可以使用其他嵌入式权限,我们为什么需要这样做?实际上总体上只是一个糟糕的设计选择,但它是微软所以不足为奇。
    【解决方案2】:

    答案在你链接的页面上,

    • 授权:application:///

    ... 此外,“/”字符必须替换为“,”字符和保留字符,例如“%”和“?”必须逃脱。详情请参阅 OPC

    所以

    ,,, 部分应该意味着什么吗?

    它是///的替代品

    逗号之间可以有任何内容吗?

    不。

    更正:OPC(开放式打包)链接指向ECMA-376,其中包含诸如
    pack://http%3c,,www.openxmlformats.org,my.container/a/b/foo.xml 之类的示例

    但是 afaik 不适用于 WPF。

    【讨论】:

    • 我刚刚访问了链接页面:msdn.microsoft.com/en-us/library/aa970069.aspx,它没有提到任何关于用逗号替换“///”的内容。它显示“application:///”,然后立即给出用逗号替换斜杠的示例,但它甚至没有提及替换或解释它们被替换的原因。看它是令人困惑的,整个语法是一个怪物。我不知道他们希望任何人如何使用它。
    • 它正在解决一个更大的问题,我想期望是为 WPF 提供更多工具。那从未发生过。
    • 如果您提到(您应该知道)为什么显然需要(是否存在?)将 /// 替换为我自己也遇到了这个问题,这一切似乎更像是一堆魔法咒语,而不是其他任何东西。
    • @Kris:我知道已经晚了,但我添加了一个更深入的答案。
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多