WPF除了上节静态资源和动态资源,还有其它类型资源。学会如何添加使用会让我们编程变得更加游刃有余。

二进制资源其实是一些传统的资源项,比如位图,音频文件,视频文件,松散文件(LooseFile)等等。对于这些资源项我们可以将其存储为松散文件,或者编译进程序集中。

如何向程序集添加二进制文件,先讲讲添加字符串二进制文件,步骤如下:

(1)点击Resources.resx ;(2)添加字段;(3)将访问修饰符改为:Public

<Window x:Class="OtherResources.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:res="clr-namespace:OtherResources.Properties"Title="MainWindow" Height="350" Width="525"><Grid><TextBlock Text="{x:Static res:Resources.UserName}"/></Grid>
</Window>

上述是添加二进制字符串文件,在日常的开发中,肯定会用到图片、音频之类的文件,一般操作相信大家看到已经掌握,但我们往往会忽视其构建模式(生成操作)。

WPF引入了统一资源标致Uri((Unified Resource Identifier))来访问资源。其中较为常见的情况是用Uri加载图像。Uri表达式的一把形式为:协议+授权+路径:

协议:pack://

授权:有两种,一种用于访问编译时已经知道的文件,用application:///。一种用于访问编译时不知道、运行时才知道的文件,用siteoforigin:///

'file:///C:/path-to-local-file/root.png';类似文件系统

wpf一般用逗号代替斜杠,也就是改写作application:,,,和pack:,,,

路径:分为绝对路径和相对路径。一般选用相对路径,普适性更强。

Resource:将资源放入程序集中(如果是有本地化支持的话会编译到对应语言集的子程序集中)。其中有一个Embedded Resource(嵌入式资源)和Resource,这两者都会在应用程序中嵌入一个程序集资源,但WPF无法通过Uri引用在xaml和后台对这个文件进行使用,所以不建议。

Content:将这个资源作为一个松散文件加入到程序集中,程序集会记录对应的文件是否存在及其路径。它跟完全松散文件有区别,完全松散文件程序集并不知道有这个文件存在,在程序运行时才会去访问这个路径获取资源。

如果构建模式是Resource,那么复制到输出目录应该选择不复制(虽然可以选择复制,但毫无意义,系统运行不依赖这些文件),这比较适合一次性使用不需要更改的小型文件,不至于程序很庞大;如果构建模式是Content复制到输出目录必须选择始终赋值或较新则复制,否则无论前台或后台获取,程序运行都会找不到资源。因此,当打包.exe执行文件时,前者不需要拷贝资源文件与执行文件放在一起,但Content需要,否则无法使用该资源,并在保证资源文件名称前后一致的前提下,可以替换内容,适合尚未决定使用的大型文件。

首先/资源=pack://application:,,,/资源 = pack://application:,,,/程序集;component/资源
前者只能引用本程序集,第3是可以引用其它程序集资源,如果程序集是本身等于前2者
情况1:针对xaml同一程序集引用
1)设置Resource
pack://application:,,,/资源和它的等价写法可访问
2)设置成Content
pack://siteoforigin:,,,/资源
pack://application:,,,,/资源和他的等价都能访问
但设置content注意输出目录选始终复制或较新复制,否则上面几种方法无法引用资源,不管调试还是后期发布运行程序情况2:针对xaml引用其它程序集资源(直接引用)
只有pack://application:,,,/程序集;component/资源,这是访问外程序集,但资源必须设置成Resource,否则无法访问。上述是一般用法,实际代码中肯定会架构一个样式程序集A,然后引用A中的字典xaml到本程序集,然后引用带一些图片的样式。<Image Source="/Resource;component/ResImage/maximize.png"/>可以,但必须改成Resource
<Image Source="pack://application:,,,/ResImage/maximize.png"/>不可以
<Image Source="pack://siteoforigin:,,,/ResImage/maximize.png"/>可以,必须是content及要复制
<Image Source="pack://application:,,,/Resource;component/ResImage/maximize.png"/>可以,但必须改成Resource
<Image Source="/ResImage/maximize.png"/>不可以
<Window x:Class="OtherResources.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid><WrapPanel>        <Button Width="100" Name="Btn1" Margin="20,0,0,0" Height="25"><!--相对路径--><Image Source="Resources/xx.png" Stretch="fill"/><!--绝对路径--><!--<Image Source="pack://application:,,,/Resources/xx.png" Stretch="fill"/>--></Button><Button Width="100" Name="Btn2" Margin="20,0,0,0" Height="25"><!--相对路径--><Image Source="Resources/xx.png" Stretch="fill"/><!--绝对路径--><!--<Image Source="pack://application:,,,/Resources/xx.png" Stretch="fill"/>--></Button>         </WrapPanel></Grid>
</Window>

当然我们可以在后台获取:

<Window x:Class="OtherResources.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid><WrapPanel>        <Button Width="100" Name="Btn1" Margin="20,0,0,0" Height="25"><Image x:Name="image1" Stretch="Fill"/>          </Button><Button Width="100" Name="Btn2" Margin="20,0,0,0" Height="25"><Image x:Name="image2" Stretch="Fill"/></Button>         </WrapPanel></Grid>
</Window>
 public MainWindow(){InitializeComponent();image1.Source = new BitmapImage(new Uri(@"Resources/xx.png", UriKind.Relative));//相对路径image2.Source = new BitmapImage(new Uri(@"Resources/xx.png", UriKind.Relative));//image1.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resources/xx.png"));绝对路径//image2.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resources/xx.png"));}

如何运用完全松散文件(代码未自动生成任何标记,程序运行时才知道),"pack://SiteOfOrigin:,,,/Resources/xx.png",可以获取任何独立于程序的松散文件,甚至可以跨程序集获取资源。一般情况,生成操作选择无或Content复制到输出目录选择始终赋值或较新复制。而且,跟Content一样,也可以通过同命名来换内容。

//使用SiteOfOrigin只有绝对路径,没有相对路径
<Image Source="pack://SiteOfOrigin:,,,/Resources/xx.png" Width="50" Height="50"/>
//或者后台
// image1.Source = new BitmapImage(new Uri(@"pack://SiteOfOrigin:,,,/Resources/xx.png"));

若WPF需要引用外部项目资源的方法 WPF中如果你使用的资源文件不是本程序集的,是另外的程序集,就可以这样做(其它引用,包括SiteOfOrigin、后台,方式都像前面一样,这里只是内容有变化): 1.引用要用的程序集,pack://application:,,,/程序集名称;component/路径 ,其中pack://application:,,,可以省略 示例:

<Image Source="pack://application:,,,/Skin;component/Resources/xx.png"/>
//或直接相对路径
<Image Source="/Skin;component/Resources/xx.png"/>

总结

WPF中的资源有两种,一种称为“程序集资源”( assembly resources)或者“二进制资源”(binary resources),在MSDN中将其称为“应用程序数据文件”(application data files);另外一种称为资源或者对象资源(object resources)、“逻辑资源”(logic resources),甚至“声明式资源”(declarative resources)。统称前者为程序集资源,本章开头所介绍的。后者为逻辑资源,上一章节的动态、静态资源。

关于"pack://application:,,,/xx.png",不管哪种写法,pack://application:,,,所到达的目录层是程序源文件所在文件夹,必须是指定自动生成的Resources文件夹或Resources再下级,否则报错;"pack://SiteOfOrigin:,,,/Resources/xx.png",一种写法,也必须到达上述文件,只要保证Debug下有引用的资源文件,即可获取,不指定Resources文件夹。

与直接把资源放置在程序运行目录不同的是,添加Content资源文件,会向程序集(AssemblyAssociatedContentFile)中添加一个定制特性,该程序集记录文件是否存在及其相对位置,这就是与引用完全松散文件的区别。

完全松散的文件指那些没有添加到项目中,只是拷贝在程序目录中的文件。有关二进制资源先介绍到这里,还是比较详细的,下一章我们再介绍其它资源。

WPF教程(六)二进制资源相关推荐

  1. WPF教程六:布局之Grid面板(转)

    WPF教程六:布局之Grid面板 Grid:网格面板 Grid顾名思义就是"网格",以表格形式布局元素,对于整个面板上的元素进行布局,它的子控件被放在一个一个事先定义好的小格子里面 ...

  2. WPF整理-使用逻辑资源

    WPF整理-使用逻辑资源 原文:WPF整理-使用逻辑资源 "Traditional application resources consist of binary chunks of dat ...

  3. 【STM32】标准库与HAL库对照学习教程六--位带操作

    [STM32]标准库与HAL库对照学习教程六--位带操作 一.前言 二.准备工作 三.位带介绍 1.位带操作 2.STM32位带及位带别名区域 四.位带区与位带别名区地址转换 五.GPIO的位带操作 ...

  4. python零基础入门教程视频下载-零基础学Python入门教程,视频资源下载

    课程名称 零基础学Python入门教程,视频资源下载 课程目录 第一章 :Python介绍和安装 01.Python语言的特点 02.Python的发展历史与版本 03.Python的安装 第二章 : ...

  5. mujoco机器人建模教程和优质资源总结-长期更新

    mujoco机器人建模教程和优质资源总结-长期更新 前言 最近要利用mujoco搭建一个定制化的击球模型,有一些基础的功能我找不到实现的例程.因此想着能不能做一个归纳和总结,在准备向社区"白 ...

  6. Kubernetes入门教程 --- 使用二进制安装

    Kubernetes入门教程 --- 使用二进制安装 1. Introduction 1.1 架构图 1.2 关键字介绍 1.3 简述 2. 使用Kubeadm Install 2.1 申请三个虚拟环 ...

  7. KaliLinuxNetHunter教程下载相关资源

    KaliLinuxNetHunter教程下载相关资源 当用户将刷机工具准备完后,则需要下载ROM包.ROM是ROM image(只读内存镜像)的简称,常用于手机定制系统.一般手机刷机的过程,就是将只读 ...

  8. WPF中引入外部资源

    有时候需要在WPF中引入外部资源,比如图片.音频.视频等,所以这个常见的技能还是需要GET到. 第一步:在VS中创建一个WPF窗口程序 第二步:从外部引入资源,这里以引入图片资源为例 1)新建Reso ...

  9. [转]Android Studio系列教程六--Gradle多渠道打包

    转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...

最新文章

  1. EUV光刻机全球出货量达57台
  2. Discuz X3.1 论坛修改的方法(门户的修改)
  3. curl post https_Linux命令cURL详解,并实现文件定时上传到ftp服务器的程序
  4. 1 SE21开发包创建
  5. Java 8 之后,还有哪些进化的功能?
  6. Zabbix添加nginx监控项
  7. 点击复制,兼容ios-safari
  8. mysql数据库MyISAM存储引擎_MySQL数据库MyISAM存储引擎
  9. 新安装的apache无法解析php,apache无法解析php
  10. VirtualBox 中安装 Win10
  11. CentOS 6.5 Thinkpad 小红点(TrackPoint)设置
  12. 链桨PaddleDTX系列 - xdb源码分析(一)
  13. android移动端设计规范,干货|超全面的移动端UI 设计规范整理汇总(下)
  14. 80/20时间管理法则全面解析
  15. gitlab安装配置
  16. 娱乐-Jay键盘钢琴琴谱
  17. 艾宾浩斯遗忘曲线PHP,艾宾浩斯抗遗忘曲线 [抗遗忘艾宾浩斯记忆法]
  18. 音视频入门-10-使用libyuv对YUV数据进行缩放、旋转、镜像、裁剪、混合
  19. 数据库审计系统是什么
  20. python xml快速解析tree_python解析XML笔记(etree)

热门文章

  1. Apicloud——关于上传图片、视频
  2. 求前辈帮助DataGridView.Rows[index].Cells[13].Value的值为{}是什么意思
  3. 一步步演示Avantage软件如何处理XPS谱图!
  4. java第五章:面向对象(oop)三大特性之多态
  5. pandas 从文本中提取数字(正则表达式)
  6. 心理学-在对的时间遇见对的人,不负自己,不负时光。
  7. 【MATLAB Image Processing Toolbox 入门教程三】快速入门之“在多光谱图像中寻找植被”
  8. 资深HR告诉你,面试中你不知道的那些秘密!
  9. 源代码和目标代码之间的区别
  10. 让人无法拒绝的内容种草营销