WPF的资源引用大致有下面几个点需要讨论,下面我们逐个讨论。

目录

Pack Uri方案

资源文件Pack Uri

本地程序集资源

引用程序集资源

内容文件 Pack Uri

源站点 Pack Uri

页面文件

绝对和相对Pack Uri

PackUri解析

使用 PackUri 编程

在标记中使用PackUri

绝对URI

相对URI

代码中使用PackUri

常见PackUri方案

指定应用程序MainWindow

导航到页面

指定窗口图标

加载图像、音频和视频文件

加载资源字典



在WPF中统一资源标识符用于通过多种方式标识和方式加载文件,例如

  1. 加载图片
  2. 导航到指定页
  3. 架子车数据文件
  4. 指定初始化页

另外,他还可以用来标识文件的存储位置,例如

  1. 当前程序集
  2. 引用程序集
  3. 相对于程序集的某个位置
  4. 用硬车光绪的源站点

为了提供一整套方案,WPF使用了 Pack Uri方案。

Pack Uri方案

众所周知,一般我们使用的URI路径标识方案是以httpFtpfile开头的(前缀),我们这里讲的Pack Uri方案不使用这些,统一使用pack作为其前缀,所以我们的路径就是类似于这样 pack://机构/路径

机构,标识部件的包类型。

路径,标识部件在包中的位置。

一个包中一个存放一个或多个文件,例如

  1. 编译在本地程序集的资源文件
  2. 编译到所引用的程序集内的资源文件
  3. 编译到引用程序集内的资源文件
  4. 内容文件
  5. 源站点文件

访问这些文件,WPF支持俩种方式。

  • application:///
  • siteiforigin:///

application:/// 用来标识在编译时已知的应用程序数据文件,包括资源文件和内容文件。

siteiforigin:/// 用来标识源站点文件。

具体关于 URI的格式可以参考标准RFC2396

下面的图片说明具体的关系

资源文件Pack Uri

本地程序集资源

所谓资源文件是指将文件配置为Resource,MSBuild 之后编为程序集。资源文件可以在当前程序集也可以引用程序集。

编译到当前程序集的资源文件访问格式如下 授权;,,,/路径

  1. 授权:application:///
  2. 路径 资源文件的名称,包括其相对于本地程序集的文件夹根目录的路径。

下面的演示Pack Uri路径为资源文件在当前文件夹。

pack://application:,,,/ResourceFile.xaml

下面的演示Pack Uri路径为资源文件在当前文件夹下的子文件夹下。

pack://application:,,,/SubFolder/ResourceFile.xaml

引用程序集资源

引用程序集资源路径相对于本地程序集复杂一点,格式如下

程序集短名称{;版本}{;公钥};组件/路径

  • 程序集短名称:所引用程序集的短名称
  • ;版本[可选]:程序集版本信息,在加载多个具有相同名称的引用程序集时使用。
  • ;公钥[可选]:相对应用程序集的签名的公钥。在加载多个具有相同名称的引用程序集时使用。
  • ;组件:指定当前程序集所引用的程序集名称
  • /路径:资源文件名称,如果存在于子文件夹中,那么这里也需要包含子文件夹。

上面的符号均为英文字符,不排除键入错误的可能

下面的演示Pack Uri路径为资源文件在当前文件夹。

pack://application:,,,ReferencedAssembly;component/ResourceFile.xaml

下面的演示Pack Uri路径为资源文件在当前文件夹下的子文件夹下。

pack://application:,,,ReferencedAssembly;component/SubFolder/ResourceFile.xaml

当要指定特定版本时

pack://application:,,,ReferencedAssembly;v1.0.0.1;component/SubFolder/ResourceFile.xaml

这种带版本的方式不建议使用,在实际使用非常容易导致资源文件找不到。(程序集版本可能被其他人误升级)

以下格式WPF 时不支持

pack://siteoforgin:,,,ReferencedAssembly;component/SubFolder/ResourceFile.xaml

内容文件 Pack Uri

内容文件和资源文件的格式非常类似,格式如下授权,,,/路径

下面的演示Pack Uri路径为内容文件与当前程序集在同意文件夹中。

pack://application:,,,/ContentFile.xaml

下面的演示Pack Uri路径为内容文件在当前程序集的子文件夹下

pack://application:,,,/SubFolder/ContentFile.xaml

源站点 Pack Uri

源站点文件的pack Uri路径格式授权,,,/路径

  • 授权:siteoforgin:///
  • 路径:源站点文件的可执行程序集启动位置的路径

下面示例指在启动程序集所在文件夹

pack://siteoforgin:,,,/SiteOfOrginFile.xaml

下面的示例指在程序集所在文件夹的子文件夹下

pack://siteoforgin:,,,/SubFolder/SiteOfOrginFile.xaml

页面文件

指将一个xaml页面文件识别为页面类文件。否则这个这个文件(一般为*.xaml.cs和*.xaml俩个文件)无法识别为类,被程序直接使用

一个xaml通常需要继承自以下根元素

  • System.Windows.Window
  • System.Windows.Controls.Page
  • System.Windows.Navigation.PageFuction<T>
  • System.Windows.ResourceDictionary
  • System.Windows.Documents.FlowDocument
  • System.Windows.Contriols.UserControl

绝对和相对Pack Uri

我们前面介绍的都是绝对包Uri。在同一个程序集中当绝对路径为

pack://application:,,,/ResourceFile.xaml

其相对引用方式为

/ResourceFile.xaml

当有如下文件夹

App.xaml

Page2.xaml

\SubFolder\Page1.xaml

\SUbFolder\Page2.xaml

当Page2要引用Page1时,则可以直接使用/Page1.xam,页可以使用/SubFolder/Page1.xaml,也可以直接使用绝对包引用方式。

PackUri解析

Pack Uri使得不同的类型的文件包Uri看起来很相同,

为了探测Pack uri的引用文件类型,WPF 依照如下如下方法探测文件类型。

探测与pack URI匹配的属性的程序集元数据

AssmeblyAssociatedContentFileAttribute

如果找到该特性,则找到一个内容文件,如果找不到则探测编译到本地程序集的资源文件,如果找到与包URI路径匹配的资源文件,则包URI引用资源文件,否则包URI无效。

  • URI包解析不适用场景
  • 引用程序集的内容文件
  • 应用程序集的嵌入文件
  • 源站点文件

使用 PackUri 编程

许多类支持使用packURI设置属性,例如

  • Application.StartUpUri
  • Frame.Source
  • NavigationWindow.Source
  • Hyperlink.NavigateUri
  • Window.Icon
  • Image.Source

在标记中使用PackUri

绝对URI

绝对Pack Uri
文件 绝对包URI
资源文件-本地程序集 pack://application:,,,/ResourceFile.xaml
资源文件-本地程序集-子文件夹 pack://application:,,,/SubFolder/ResourceFile.xaml
资源文件-引用程序集 pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml
资源文件-引用程序集-子文件夹 pack://application:,,,/ReferencedAssembly;component/SubFolder/ResourceFile.xaml
资源文件-引用程序集-版本-子文件夹 pack://application:,,,/ReferencedAssembly;v1,0,0,2;component/SubFolder/ResourceFile.xaml
内容文件 pack://application:,,,/ContentFile.xaml
内容文件-子文件夹 pack://application:,,,/SubFolder/ContentFile.xaml
源站点文件 pack://siteoforigin:,,,/S00File.xaml
源站点文件-子文件夹 pack://siteoforigin:,,,/SubFolder/S00File.xaml

相对URI

相对URI访问
文件 相对PackUri
本地程序集内的资源访问 /ResourceFile.xaml
本地程序集内的资源访问-子文件夹 /SubFolder/ResourceFile.xaml
引用程序集内的资源访问 /ReferencedAssembly;component/ResourceFile.xaml
引用程序集内的资源访问-子文件夹 /ReferencedAssembly;component/SubFolder/ResourceFile.xaml
内容文件 /ContentFile.xaml
内容文件-子文件夹 /SubFolder/ContentFile.xaml

代码中使用PackUri

默认情况下,Uri的构造器使用的使用的是绝对路径方式,所以下面的代码是正确的

Uri uri=new Uri("pack://application:,,,/File.xaml");

下面的代码是错误

Uri uri=new Uri("/File.xaml");

所以当要使用相对路径时怎么使用呢?示例如下,下面俩种写法都是正确的

//绝对路径
Uri absoluteUri=new Uri("pack://application:,,,File.xaml",UriKind.Absolute);
//相对路径
Uri relativeUri=new Uri("/File.xaml",UriKind.Relative);

当你不清楚传入的PackUri地址是绝对的还是相对的时候,请直接使用RelativeOrAbsolute

TextBox box=new TextBox();
var uri=new Uri(box.Text,UriKind.RelativeOrAbsolute);

关于PackUrine 在代码中的引用总体和xaml种类似,你只要记住,uri默认单参构造器使用的是Absolute,当你搞不清楚使用的是相对uri还是绝对uri时,请使用RelativeOrAbsolute。

常见PackUri方案

指定应用程序MainWindow

StartUpUri用来指定WPF应用程序要显示的第一个窗口。对于独立应用程序,UI可以是一个窗口。见下面的示例代码

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" StartUri="MainWindow.xaml" />

导航到页面

下面的代码颜色如何导航到页面

<Page xmlns="http://......." WindowTitle="Page With HyperLink" WindowWidth="250" WindowHeight="250" />
<Hyperlink NavigateUri="UriOfPageToNavigateTo.xaml" > Navigate To Another Page</Hyperlink>

指定窗口图标

<Window xmlns="http://schemas.microsoft.com....." Icon="WpfIcon.ico" />

上面Icon使用的路径为相对路径方式,你可以将icon MSbuild为Resource也可以是Content。从前面的讲解可知道他们的写法是一样的。

加载图像、音频和视频文件

<MediaElement Stretch="Fill" LoadBehavior="Play" Source="pack://siteoforigin:,,,/Media/bee.wmv"/>
<Image Source="Images/Watermark.png"/>

加载资源字典

WPF支持从外部加载主题样式,这样当更新或添加主题时就不需要重新编译程序了

<Application StartUri="HomePage.xaml" xmlns="http://schemas.microsoft.com/winfx/2006/presentation"><Applitation.Resources> <ResourceDictionary Source="pack://siteoforigin:,,,/PageTheme.xaml" /></Applitation.Resources>
</Application>

关于WPF的资源引用问题相关推荐

  1. 魔幻一般的WPF URI资源引用

    wpf,可以通过URI引用资源,比如图片,xaml,音频等. 如果原来是有html的基础知识,可以用起来会比较方便,比较容易理解. 但是也有可能因为有了html的基础知识因为惯性思维导致无法理解. W ...

  2. wpf资源嵌套,一个资源引用另外一个资源,被引用的资源应该声明在前面

    在wpf的XAML的Window.Resources中,一个资源引用另外一个资源,出现如下错误: "错误 1 "{DependencyProperty.UnsetValue}&qu ...

  3. WPF XAML 资源样式模板属性存放位置

    WPF XAML 资源样式模板属性存放位置 原文:WPF XAML 资源样式模板属性存放位置 WPF的XAML 资源申明 类似HTML. 整体来说分3种 1.行类资源样式属性 1.1 行内属性 < ...

  4. wpf中图片资源引用问题

    在wpf中,有时会遇到如下错误: System.Windows.Markup.XamlParseException:""在"System.Windows.Baml2006 ...

  5. WPF的资源Resource

    文章目录 WPF资源 0.WPF支持的资源形式或者说分类 1.资源层级有四个等级 2.合并资源字典到Resource属性 3.关于静态StaticResource和动态Resource 4.关于资源字 ...

  6. 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )

    文章目录 一.开启资源压缩 二.启用严格模式的资源引用检查 三.自定义保留/移除资源配置 四.资源压缩效果 五.完整配置 1.keep.xml 配置 2.build.gradle 构建脚本 六.参考资 ...

  7. 【Android 应用开发】Android 工程修改包名流程 ( 修改 applicationId | 修改 package | 修改 R 资源引用 | 修改 BuildConfig 引用 )

    文章目录 一. Android 工程修改包名流程 二. 修改 applicationId 三. 修改 package 包名 四. AndroidManifest.xml 清单文件组件 五. 修改 R ...

  8. android 资源引用 自定义标题栏

    http://blog.sina.com.cn/s/blog_72fad6270100x7k2.html styles.xml放在res/values文件夹中 具体放在哪里,这要深入了解android ...

  9. wpf开源ui引用步骤_如何通过7个步骤开源您的学术作品

    wpf开源ui引用步骤 学术工作非常适合开源的精神:赠送的价值越高,您的学术声誉和收入就越大. 教授通过在同行评审文献中的期刊文章中免费分享自己的最佳思想来实现这一目标. 这是我们的货币,没有良好的发 ...

最新文章

  1. 图论 ---- 思维搜索全图任意位置传送 1520G - To Go Or Not To Go?
  2. springboot项目 访问不到静态资源css
  3. HDU 2865 Birthday Toy [Polya 矩阵乘法]
  4. Spring配置文件applicationContext.xml的两种拆分方式
  5. RHEL7.2上基于eSpeak实现TTS
  6. serlvet中的过滤器filter
  7. nginx nodejs环境配置_服务器环境配置安装(mysql+redis+nodejs+nginx)
  8. surface mesh framework运行
  9. python3 beautifulsoup_Python3中BeautifulSoup的使用方法
  10. Executor框架(转载)
  11. 【转】Linq 求和,求平均值,求最大,求最小,分组,计数
  12. 使用角色管理工具 安装或配置microsoft.net framework 3.5 sp1
  13. matlab雷达噪声模型,雷达信号处理MATLAB仿真.doc
  14. matlab中gen2par函数,R语言中的par()函数终于明白了
  15. PPT文件不能编辑怎么回事?
  16. CAN201 网络编程 笔记
  17. PostWoman(网页调试工具)
  18. Ribbons界面介绍(2)——这是不是合适的用户界面
  19. 典当行最多能够抵押多长时间
  20. 统计所有微信好友的性别

热门文章

  1. 2022年R2移动式压力容器充装考试模拟100题及在线模拟考试
  2. 计算机网络研究进展,计算机网络信息空间(Cyberspace)的人文地理学的研究进展和展望.pdf...
  3. 练气六层 —— 重要知识点总结
  4. 回答完数据库连接池原理,面试官跪着求我入职他们公司
  5. 李彦宏:有人弄死其他对手 自己也没好结果
  6. java实现Stripe信用卡支付
  7. 网状神经系统的典型特点,网状结构神经系统
  8. window10卸载软件 搜 控制面板
  9. html5 3d背景墙,3D背景墙的价格怎样?3D背景墙的介绍?
  10. Python - 面向对象编程