WPF 图片显示中的保留字符问题

在WPF中显示一张图片,本是一件再简单不过的事情。一张图片,一行XAML代码便可。ide

可是前段时间遇到了一件奇怪的事:测试

开发机上运行正常的程序,在某些客户机器上却显示不了图片,并且除了这个问题,其它运行状况都正常。开始排查问题吧,先检查代码,而后检查编译打包过程,并无发现任何问题。再而后去客户机器上测试,对应路径下的图片是否存在,是否图片所在路径的读写有问题,仍是没有发现问题。最后发现,当程序移到其它路径的时候,就一切正常了。而出现错误的路径是:D:\\C#\\ 。这就是今天想说的问题,某些特殊符号(或叫保留字符)对图片显示的影响。code

首先简单回顾一下WPF中显示图片经常使用的两种图片资源存储方式:资源 和 内容。资源会被编译到exe或dll中,使用优点是速度,简便。而内容是与exe或dll有显式关联的独立文件,他的使用优点是灵活。简单介绍这么几句,相信你们都已经很了解了。而个人项目由于常常须要用户本身替换图片资源文件,因此选择了“内容”的方式。orm

在WPF中,无论是资源仍是内容的方式,都是经过URI (uniform resource identifier)来标识和加载文件的。你们能够在这里对URI的构造和解析原理作更多的了解:MSDN WPF 中的 Pack URI。而Pack URI 方案由OPC (Open Packaging Conventions)规范使用,该规范利用了RFC 2396的扩展性来定义Pack URI方案。也就是说咱们定义的URI必须符合RFC 2396的规定。blog

Pack URI 的受权组件是一个嵌入式 URI,它指向程序包而且必须符合 RFC 2396。 另外,必须用字符“,”替换字符“/”,而且必须对保留字符(如“%”和“?”)进行转义。 有关详细信息,请参见 OPC。

那我们就来看看这个RFC 2396 中到底对URI作了哪些规定和限制:图片

先来看一下保留字符:reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," 。顾名思义,这些字符是预留给系统使用的,咱们本身的资源URI里不能包含。资源

再看看哪些字符是被排除的:excluded = "<" | ">" | "#" | "%" | <"> 。这些字符是不容许出现的,来看看RFC 2396中对这几个字符被排除的解释吧:开发

The angle-bracket "<" and ">" and double-quote (") characters are excluded because they are often used as the delimiters
around URI in text documents and protocol fields. The character "#" is excluded because it is used to delimit a URI from a fragment identifier in URI references (Section 4). The percent character "%" is excluded because it is used for the encoding of escaped characters.

看到这里就很明显了,咱们的图片由于项目路径的关系,包含了“#”符号,而图片又使用了内容的方式,致使URI解析失败,图片没有显示。get

虽然咱们本身只写了一行XAML代码去实现图片显示,可是WPF的Pack URI作了资源分类,解析和文件加载等。it

好了,到此为止就已经很明确的知道了致使错误的缘由了,可是暂时还没想到解决办法,只能告诉用户去规范目录命名,若是哪位有解决办法,欢迎回复赐教,感谢!

相关文章
相关标签/搜索