`
gstarwd
  • 浏览: 1512231 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Silverlight Image Source URI : 一个反斜杠引发的血案

    博客分类:
  • .NET
阅读更多

Silverlight Image Source URI : 一个反斜杠引发的血案

Silverlight2现在支持的Image格式有jpg和png,部分png编码也不支持,同时有些png在xaml的design预览中不可见,但运行时可见。请看XAML markup中两行代码的异同:

< StackPanel Background ="White" Orientation ="Vertical">

< Image x : Name ="blue" Source ="/images/blue.png" Stretch ="None"/>

< Image x : Name ="green" Source ="images/green.png" Stretch ="None" />

</ StackPanel >

反斜杠forward-slash?有没有虾米区别呢?如图所示,名称为Resource测试示例解决方案资源管理器以及运行效果:以反斜杠开头的 blue图片需要放在ClientBin目录下的相应文件夹里;不以反斜杠开头的green图片应该放在Resource目录下的相应文件夹里。这样才可 正确引用,否则会发生ImageError。

 

 

为什么?两者都是相对路径,到底反斜杠带来了什么区别呢?反斜杠开头的相对路径,代表的相对位置是应用程序运行的根目录,即.xap压缩包内,若在 这其中寻找不到要引用的文件,则相对路径的回退机制(fallback mechanism )自动在在.xap所在的目录,本例即为ClientBin目录中寻找加以引用。两个位置都没有,才会发生错误。不以"/"开头,则代表的相对位置是引用 该图片的XAML文件所在的目录,本例即page.xaml文件所在的Resource目录。

 

那么究竟选择哪种方式呢?把xap文件重命名为zip文件,解压之,再用reflector反编译其中的dll文件,发现其包含了green图片, 却没有blue图片。其实也很明显,blue所在的images文件夹与.xap同级,自然不会包含在内。由此可知,不以反斜杠开头的green图片嵌入 到Silverlight程序中的xap文件直接下载到客户端,而blue图片则按需索取(on-demand),当显示时再去下载。当数据量较大时,不 以反斜杠开头的方式加载程序的时间就过长,用户体验不好,以"/"开头自然就无此无虑,不过以反斜杠开头的话,在xaml中设计预览看不到,只有程序运行 才可以看到。(若为了预览,可先从ClienBin那里复制一份放在page.xaml同级目录下供设计使用,程序发布时予以删除。)

 

除了在XAML中直接确定Image的Source URI,当然也可以在code-behind中确定,此时反斜杠的用法和XAML中相通。

C#:Image img = new Image();

img.Source = new BitmapImage(new Uri("test.jpg", UriKind.Relative)); //page.xaml所在目录下

//img.Source = new BitmapImage(new Uri("/test.jpg", UriKind.Relative)); //.xap所在目录下

 

话说要是使用诸如http://www.liongg.net/test.jpg之类绝对URI就没反斜杠什么事了。在代码中还可以利用 Application.Current.Host.Source.AbsolutePath等方法,我试验下了,发觉太麻烦还没意思,不再多管。

 

再深入一点,甚至图片放在与page.xaml同级的文件夹下,一样可以使用反斜杠进行引用。只需要在相应图片的属性里,把Build Action选择为"Content"即可,不过该图片还是被放到.xap压缩包里了,这是后话,参见《Sivlerlight Resource 概览 》。

分享到:
评论

相关推荐

    使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core],

    无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core],解决办法:WEB/INF的lib下,除了导入jstl.jar包,还要导入standard.jar包。另外,解压standard.jar包,把.tld文件...

    ImageSource的使用

    在WPF应用开发中,`ImageSource`是一个关键的类,用于表示图像数据。它是`System.Windows.Media`命名空间下的一个抽象基类,提供了一种通用的方式来处理图像资源,无论这些资源是来源于本地文件系统还是内存。`Image...

    URI:Escape模块,awstats搜索的关键字的乱码问题解决

    不过打开这个plugin 需要perl模块儿Encode和URI::Escape的支持,一般情况下perl是默认支持的。 配置awstats后 ,运行一切正常。如果打开AWStats会显示: Error: Plugin load for plugin 'decodeutfkeys' failed ...

    WPF中Image控件Source属性的相对路径和绝对路径问题(经验总结)

    在 C# 中,我们可以使用 `Image_Test.Source = new BitmapImage(new Uri("图片路径", UriKind.RelativeOrAbsolute))` 的方式来为 Image 控件指定 Source 属性。在 C# 中指定 Source 属性时,图片路径可以是相对路径...

    Hive Beeline连接报错:Could not open client transport with JDBC Uri: jdbc:hive2://hcmaster:10000/default

    在使用Hive的Beeline客户端进行连接时,可能会遇到错误提示"Could not open client transport with JDBC Uri: jdbc:hive2://hcmaster:10000/default"。这个错误通常意味着Beeline无法通过JDBC URL成功建立到Hive ...

    Uri一个URI处理库

    Uri库是PHP编程中用于处理统一资源标识符(URI)的一个工具,由The PHP League组织开发。这个库提供了一系列的方法和类,使得开发者能够方便、安全地操作和解析URIs,包括路径、查询字符串、主机名等各个部分。在...

    【SSS】taglibs&&jstl;

    HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application

    wpf Image控件 加载SVG图片

    2. 创建一个SVGDocument对象,这需要SVG图像的URI或者SVG文本内容: ```csharp var svgUri = new Uri("pack://application:,,,/Resources/yourimage.svg"); var svgDocument = SvgDocument.Open(svgUri); ``` 3...

    perl-URI-Escape-Any :(无描述)

    `URI::Escape::Any`模块是Perl中的一个库,它专门用于处理URI的编码和解码问题。 URI编码是将特殊字符转换为百分比编码的过程,这是为了确保URI可以在HTTP请求或其他网络协议中安全传输。通常,非字母数字字符会被...

    uri:一个纯ClojureClojureScript URI库

    一个纯的Clojure / ClojureScript URI库。 主要特征 100%跨平台.cljc 符合RFC的URI联接 作为头等公民的相对URI 支持Lambda Island开源 lambdaisland / uri是Lambda Island标签上发布的越来越多的高质量Clojure库...

    Android Uri

    * 某个图片的 Uri:content://media/external/images/media/4 在 Android 开发中,我们经常需要解析 Uri,并从 Uri 中获取数据。Android 系统提供了两个用于操作 Uri 的工具类,分别为 UriMatcher 和 ContentUris ...

    magnet-uri:解析磁铁URI并返回键值的对象

    解析磁铁URI并返回键/值的对象。 也可以在带有的浏览器中使用! 使用此模块。 安装 npm install magnet-uri 用法 解码 解析磁铁URI并返回键/值的对象。 const magnet = require ( 'magnet-uri' ) // "Leaves of ...

    silverlight 显示gif动画控件,附例子

    通常,这样的控件会有一个公共属性,如`Source`,用于设置GIF文件的URL或本地路径。然后,控件内部会有一个定时器来控制帧的切换,确保动画流畅播放。例如: ```csharp GifAnimationControl gifCtrl = new ...

    Ruby-Addressable替换URI实现Ruby标准库的一部分

    `Addressable`库正是为了解决这个问题而诞生的,它是对Ruby内置`URI`库的一个增强版,特别是在处理国际化资源标识符(IRIs)和URI模板方面。 `Addressable`库遵循了三个重要的互联网标准:RFC 3986、RFC 3987和RFC ...

    WPF之Uri加载图片

    2. **代码中引用资源**:在C#代码中,可以创建一个新的`BitmapImage`对象,并通过其`BeginInit()`和`EndInit()`方法初始化,然后设置`Image`控件的`Source`属性。例如: ```csharp Image img; img = new Image();...

    angular-uri:一个允许URI.js依赖注入的角度模块

    一个允许依赖注入的角度模块 安装 通过下载 bower install angular-uri 包含URI.js &lt; script type =" text/javascript " src =" bower_components/uri.js/src/URI.js " &gt; &lt;/ script &gt; 在angular.js和...

    DataURI:一个方便的类,用于在 PHP 中处理数据 URI

    #来源和历史# DataURI 是一个最初由编写的类,并在用作示例和 。 2014 年,我对 Gist 进行了分叉,以便将其打包为微型库,供 Composer 作为其他项目的依赖项使用。 在 composer 中使用基于 Gist 的微库需要在 ...

    uri:Erlang URI 处理库

    例子 1&gt; uri:parse("syslog://somehost:912").{ok,{syslog,[],"somehost",912,"/",[]}}2&gt; uri_format:to_string(element(2, v(1)))."syslog://somehost:912/"执照版权所有 (c) 2012 Heroku 特此向任何人免费授予许可...

Global site tag (gtag.js) - Google Analytics