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 次,则需要在最终答案中包含该字符 ...
随机推荐
- Python中字符串操作
#Python字符串操作 '''1.复制字符串''' #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sStr1 = 'strcpy2' pri ...
- 基于Web2.0的RIA框架设计与实现
http://www.doc88.com/p-8866851533856.html http://cdmd.cnki.com.cn/Article/CDMD-10614-1012472890.htm
- hdu4044 GeoDefense
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4044 题意:一个树上的塔防游戏.给你n个结点的树,你要在树结点上建塔防御,在第 i 个结点上有 ki ...
- 【POJ2828】Buy Tickets(线段树)
题意:有一个输入序列,每次操作要把b[i]插入到第a[i]个,在第a[i]个后面的要后移,问最后序列. n<=200000 思路:顺序来只能用splay维护 考虑倒序,对于插入到第K个位置,在线 ...
- 九宝老师微信小程序开发的过程
- IE11部分图片无法显示的兼容办法
问题描述:写的网页在浏览器中测试兼容问题,FF,Chrome,Edge都完美兼容(包括Edge中的仿真),但是在IE11中却无法显示部分图片,并且报:DOM7009: 无法解码 URL 处的图像 错误 ...
- js获取get方式传递的参数
String.prototype.GetValue= function(parm) { var reg = new RegExp("(^|&)"+ parm +" ...
- powerdesigner连接数据库 导出数据
powerdesigner连接数据库 导出数据 生成PDM文件 傻瓜试教程 也可下载文档:http://download.csdn.net/detail/shutingwang/6378665 ...
- 弄个知乎的粒子动态背景_实践particles.js
好久没登录知乎,发现他们的登录页面粒子动态效果蛮炫的,查一下代码用了Particles.js基于Canvas画布创建粒子颗粒效果. 上图 上图: 感觉有比格,就照着弄了一个,玩玩. githu ...
- Select语句也会引起死锁
项目上线,准备验收前出现了一个严重的问题:很多select语句作为死锁的牺牲,大部分报表无法打开.这个问题影响范围很大所有的报表都无法访问,而我们的报表是放在电视上面轮播的,电视放在工厂里面,所以出现 ...