WPF 图片显示中的保留字符问题
在WPF中显示一张图片,本是一件再简单不过的事情。一张图片,一行XAML代码即可。
但是前段时间遇到了一件奇怪的事:
开发机上运行正常的程序,在某些客户机器上却显示不了图片,而且除了这个问题,其它运行情况都正常。开始排查问题吧,先检查代码,然后检查编译打包过程,并没有发现任何问题。再然后去客户机器上测试,对应路径下的图片是否存在,是否图片所在路径的读写有问题,还是没有发现问题。最后发现,当程序移到其它路径的时候,就一切正常了。而出现错误的路径是:D:\\C#\\ 。这就是今天想说的问题,某些特殊符号(或叫保留字符)对图片显示的影响。
首先简单回顾一下WPF中显示图片常用的两种图片资源存储方式:资源 和 内容。资源会被编译到exe或dll中,使用优势是速度,简便。而内容是与exe或dll有显式关联的独立文件,他的使用优势是灵活。简单介绍这么几句,相信大家都已经很了解了。而我的项目因为经常需要用户自己替换图片资源文件,所以选择了“内容”的方式。
在WPF中,不管是资源还是内容的方式,都是通过URI (uniform resource identifier)来标识和加载文件的。大家可以在这里对URI的构造和解析原理做更多的了解:MSDN WPF 中的 Pack URI。而Pack URI 方案由OPC (Open Packaging Conventions)规范使用,该规范利用了RFC 2396的扩展性来定义Pack URI方案。也就是说我们定义的URI必须符合RFC 2396的规定。
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解析失败,图片没有显示。
虽然我们自己只写了一行XAML代码去实现图片显示,但是WPF的Pack URI做了资源分类,解析和文件加载等。
好了,到此为止就已经很明确的知道了导致错误的原因了,但是暂时还没想到解决办法,只能告诉用户去规范目录命名,如果哪位有解决办法,欢迎回复赐教,感谢!
WPF 图片显示中的保留字符问题的更多相关文章
- XML中的五个保留字符及实体引用
字符名称 字符 实体引用 和 & & 大于号 > > 小于号 < < 单引号 ‘ ' 双引号 “ " 在XML文档中,构成元素内 ...
- URL中的保留和不安全字符
书写URL时要使用US-ASCII字符集可以显示的字符. http://www.google.com 如果需要在URL中使用不属于此字符集的字符,就要使用特殊的符号对该字符进行编码. 如:最常使用的空 ...
- WPF之路一:相对路径图片显示
由于公司项目的需要,改为WPF开发,因此需要学习WPF,遇到的第一个问题就是在显示的图片的时候,写绝对路径,图片显示没有问题,但是写相对路径的时候,发现图片无法正常显示,在网上搜了一下,得到的答案是需 ...
- WPF图片浏览器(显示大图、小图等)
原文:WPF图片浏览器(显示大图.小图等) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangshubo1989/article/details ...
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...
- C# 保存PictureBox中的图片到数据库,并从数据库读取图片显示到PictrueBox,解决报错 “无效参数”
下面是两段关键代码: /// <summary> /// 将一张图片转换为字节 /// </summary> /// <param name="img" ...
- AndroidListview 滑动过程中图片显示重复错乱解决方案
主要分析Android中Listview滚动过程造成的图片显示重复.错乱.闪烁的原因及解决方法,顺便跟进Listview的缓存机制. 1.原因分析 Listview item 缓存机制:为了使得性能更 ...
- 在VC6中基于dll开发插件用于各种图片显示(BMP/TGA/JPG/GIF/PNG/TIF/ICO/WMF/EMF/...)
一.图片显示 图片显示的方法: 1. 直接写程序 2. 第3方库 3. 调用COM组件的IPicture接口 4. 使用MFC的CPictureHolder类 5. 使用GDI+的CImag ...
- 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...
随机推荐
- LVS简单实现NAT&DR模型
LVS:Linux Virtual Server 一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org. 现在LVS已经是Linux标准内核的一部分 ...
- LDAP与禅道
一:搭建禅道做测试 搭建过程参考http://www.cnblogs.com/hiyu/p/5841650.html 1):下载 ZenTaoPMS.Pro5.5.1.zbox_64.tar.gz ...
- Java 枚举7种常见用法
(转)原创地址:http://blog.lichengwu.cn/java/2011/09/26/the-usage-of-enum-in-java/ JDK1.5引入了新的类型--枚举.在 Java ...
- clr via c# 读书笔记
WOW64 WOW64 (Windows 位应用程序提供了 位的模拟,可以使大多数 位应用程序在无需修改的情况下运行在 Windows 位版本上. com对象 COM:The Component Ob ...
- SQL存储过程删除数据库日志文件的方法
--日志文件收缩至多少M DECLARE @DBLogSise AS INT SET @DBLogSise=0 --查询出数据库对应的日志文件名称 DECLARE @strDBName AS NVAR ...
- python课程第一周重点记录
- <停车卫> 产品需求说明书 version 2.0
<停车卫> 产品需求说明书 文档版本号: Version 2.0 文档编号: xxxx 文档密级: 归属部门/项目: 产品名: 停车卫 子系统名: 编写人: kina 编写日期: 2015 ...
- caffe net 可视化工具
http://ethereon.github.io/netscope/#/editor 将对应的网络输入到里面,然后按shift+enter即可查看对应的网络结构
- listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
1.错误提示:Cannot have multiple items selected when the SelectionMode is Single. 刚刚在处理两个Listbox时,将其中一个li ...
- AndroidLinker与SO加壳技术之上篇
1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...