在前一个Post当中,我从资源编译行为的角度讨论了WPF中的资源。但是,不管是Resource还是Content都是在编译时声明资源。如果我们打破这个限制,不希望指定完全确认的资源地址。WPF提供了一种类似IE地址定位的抽象,它根据应用程序部署的位置决议。

WPF将应用程序的起源地点进行概念上的抽象。如果我们的应用程序位于http://yilinglai.cnblogs.com/testdir/test.application。我们应用程序的起源地点是http://yilinglai.cnblogs.com/testdir/,那么我们就可以在应用程序中这样指定资源位置:

<Image Source=”pack://siteoforigin:,,,/Images/Test.JPG”/>

通过这种包装的Uri,使用资源的引用更加灵活。那么,这种类似Internet应用程序的资源包装Uri指定方式有什么优点呢?

1)、应用程序Assembly建立后,文件也可被替代。

2)、可以使文件只在需要使才被下载。

3)、编译应用程序时,我们不需要知道文件的内容(或者文件根本不存在)。

4)、某些文件如果被嵌入到应用程序的Assembly后,WPF将不能加载。比如Frame中的HTML内容,Media文件。

这里的pack://其实是一种URI(Uniform Resource Identifiers)语法格式。pack://<authority><absolute_path>,其中的authority部分是一个内嵌的URI。注意这个URI也是遵守RFC 2396文档声明的。由于它是被嵌入到URI当中,因此一些保留字符必须被忽略。在我们前面的例子中,斜线(”/”)被逗号(”,”)代替。其它的字符如”%”、”?”都必须忽略。

前面例子中的siteoforigin可以理解为一种authority的特例。WPF利用它抽象了部署应用程序的原始站点。比如我们的应用程序在C:\App,而在相同目录下有一个Test.JPG文件,访问这个文件我们可以用硬编码URI file:///c:/App/Test.JPG。另外一种方法就是这种抽象性:pack://siteoforigin:,,/Test.JPG。这种访问方法的便利是不言而喻的!在XPS文档规范中,对URI有更好的说明。有兴趣朋友可以在此下载。

也许你看到现在对此的理解有些问题。不用太着急,随着你对WPF越来越熟悉,会有更多的体会。对于WPF的新手(我也是),对于此点不必过度纠缠。因为WPF的Application类中提供了一些有用的方法:

Application.GetResourceStream (Uri relativeUri);

Application.GetContentStream(Uri relativeUri);

Application.GetRemoteStream (Uri relativeUri);

通过使用这些函数,隐藏了URI定位的细节。从这些函数的名称我们可以看出,它们分别对应于我在前面介绍的三种类型:Content、Resource和SiteofOrigin。

最后,简单的说明一下另一种使用资源的方式,直接定义资源,不使用任何的属性,具体的用法看例子就明白了:

<StackPanel Name="sp1">
    <StackPanel.Resources>
      <Ellipse x:Key="It1" Fill="Red" Width="100" Height="50"/>
      <Ellipse x:Key="It2" Fill="Blue" Width="200" Height="100"/>
    </StackPanel.Resources>
    <StaticResource ResourceKey="It1" />
    <StaticResource ResourceKey="It2" />
</StackPanel>

转载于:https://www.cnblogs.com/YilingLai/archive/2007/01/02/610219.html

闲话WPF之十八(WPF中的资源 [4] )相关推荐

  1. 二维数组离散程度matlab,(十八)数据分析中的一些概念

    (十八)数据分析中的一些概念 HIKAI 29 SEP 2017 0 Comments 矢量.向量.标量 矢量和向量是一个东西,只是在不同领域里面用到的不同称呼.矢量常常用在物理学中,向量在数学.几何 ...

  2. 漫谈程序员(十八)windows中的命令subst

    漫谈程序员(十八)windows中的命令subst 用法格式 一.subst [盘符] [路径]  将指定的路径替代盘符,该路径将作为驱动器使用 二.subst /d 解除替代 三.不加任何参数键入  ...

  3. RHEL6基础之十八Linux中Kill进程的方法

    Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.工作原理是向Linux系统的内核发送一个系统操作信号和某个程序的进程标识 ...

  4. 耶鲁大学公开课博弈论(十八-十九)—— 信息集与最优子博弈

    耶鲁大学公开课博弈论(十八-十九)-- 信息集与最优子博弈 理论与概念 在十八讲中介绍了全局纳什均衡点的相关内容,主要就是通过引入信息集的概念将传统的同时博弈也转变为序贯博弈问题,从而使用逆向推理解决 ...

  5. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十八) 完美精灵之八面玲珑(WPF Only)②...

    紧接着上一节,首先得解释一下为什么需要将这272张图片合成为一张大图.因为如果游戏中还有装备.坐骑等其他设置,那么我们就需要对图片源进行时时的合成:同时对272张甚至更多的图片进行合成效率高还是对2张 ...

  6. 利用WPF建立自己的3d gis软件(非axhost方式)(十)SDK中一些自带的展示面板应用...

    利用WPF建立自己的3d gis软件(非axhost方式)(十)SDK中一些自带的展示面板应用 原文:利用WPF建立自己的3d gis软件(非axhost方式)(十)SDK中一些自带的展示面板应用 先 ...

  7. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十八) 经典式属性设计及完美的物理攻击系统...

    战斗即将开始!要实现MMORPG中的攻击系统,必须为精灵增加相关的参数及属性,这些内容及它们之间的牵连关系设计决定着游戏的新颖度与耐玩性:就好比当年的传奇,系统再普通不过了,但是却因为有着恰如其分的系 ...

  8. 闲话WPF之十三(WPF中的资源)

    资源是保存在可执行文件中的一种不可执行数据.通过资源我们可以包含图像.字符串等等几乎是任意类型的数据.如此重要的功能,.NET Framework当然也是支持的,其中内建有资源创建.定位.打包和部署的 ...

  9. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...

    WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...

最新文章

  1. AI 盯上了外包司机,看后视镜就被扣分,奖金拜拜!
  2. Object-c实现各种排序算法 (汇总)
  3. ubuntu 防火墙打开关闭
  4. python计算相关系数
  5. oracle存储日志
  6. ArrayBlockingQueue源码
  7. servlet 配置 使用_配置HTTPS以与Servlet一起使用
  8. Xshell安装sql报错:The GPG keys listed for the “MySQL 8.0 Community Server“ repository are already instal
  9. sar分辨率公式_购买SAR卫星三个重要参数:分辨率、极化方式、入射角
  10. 面试题:synchronized的底层实现(偏向锁,轻量级锁,重量级锁)
  11. YOLOX系列一 -- 代码下载以及win10上demo运行
  12. 美团2018校园招聘 研发工程师(三)
  13. 学生用计算机中怎样输入分数,职称计算机考试Excel中输入分数技巧
  14. python 重试—retry库的使用和自定义超时retry
  15. 数字孪生钢厂开发可视化系统-解决方案
  16. MATLAB多径衰落信道仿真程序,基于Matlab的移动通信中多径衰落信道的仿真
  17. 微软允许永久在家办公后,发现微软像极了“微商”!
  18. 10道题熟练掌握并运用链表结构算法
  19. 21级数据结构考前模拟题
  20. 查看微信小程序的原始ID

热门文章

  1. Windows下同时安装Anaconda2(Python2)和Anaconda3(Python3)以及tensorflow
  2. Dirichlet Distribution(狄利克雷分布)与Dirichlet Process(狄利克雷过程)
  3. 常系数线性微分方程的直接解法-利用特征方程
  4. Unity 导出切片精灵
  5. java jdbc 批处理_Java JDBC批处理插入数据操作
  6. 图注意力网络_EMNLP 2019开源论文:针对短文本分类的异质图注意力网络
  7. ideahtml标签不提示_仓储物流加速,电子标签亮灯拣选系统的优势
  8. 计算机数据恢复报告单,计算机数据恢复第三章MBR引导分析篇
  9. 小米8护眼模式无效_雷军没有交代的小米9的N个细节,这篇文章全告诉你了
  10. c语言 拆分 文件,linux 将一个大文件分割成小的碎片文件 命令:csplit