在WPF应用程序开发中,总是难以记住各种访问资源的方法,遂逐一记下。

  先从资源是否编译到程序集分类

  一.程序集资源

    资源在编译的时候嵌入到程序集中。WPF中的XAML会被编译为BAML,图片等其他资源均被编译到程序集中AssemblyResources.g.resources中

    为了能够成功使用程序集资源,需要注意一下两点:

  • 资源的Build Action必须是Resource,不复制到输出目录。
  • 不要在Project Properties中使用Resource选项卡,WPF不支持这种类型的资源URI。

    使用资源

    可以在XAML中使用如下方式使用资源

    

<Image Source="Image/yun.png"></Image>

    也可以使用代码,不过这里有相对路径和绝对路径之分

img.Source=new BitmapImage(new Uri(@"E:\Photo\Image\yun.png"));

img.Source=new BitmapImage(new Uri("Image/yun.png",UriKind.Relative));

    但在实际项目中,资源总在另外一个程序集中,那么就需要跨程序集访问资源。语法如下:

    pack://application:,,,/AssemblyName;Component/ResourceName

    首先要引用具有资源的程序集

    在XAML中如下使用

<Grid>
<Grid.Background>
<ImageBrush ImageSource="pack://application:,,,/Controls;Component/Image/yun.png"></ImageBrush>
</Grid.Background>
</Grid>

    在代码中也是同样的使用方式

img.Source=new BitmapImage(new Uri("pack://application:,,,/Controls;Component/Image/yun.png"));

    另外就是资源字典的使用,一个资源字典中可以包含程序中需要使用的样式,画笔等等,资源文件也可再包含资源文件

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary.xaml"></ResourceDictionary>
<ResourceDictionary Source="Dictionary2.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<Style x:Key="btnStyle" TargetType="Button">
<Setter Property="Background">
<Setter.Value>
<ImageBrush ImageSource="Image/yun.png"></ImageBrush>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

    如果程序需要使用到换肤功能的话,那么最好由Application来加载统一的资源字典,这样实现换肤功能的话,其实就是将Application下的这一套资源换成另一套,唯一的弊端就是,在vs中看不到已经使用的样式,只有运行起来才能看到。控件换肤也是同样的道理。可以看下下面的例子

http://files.cnblogs.com/action98/WPF_ChangeSkin_Sample.rar

http://files.cnblogs.com/action98/CustomControl%E6%8E%A7%E4%BB%B6%E6%8D%A2%E8%82%A4.rar

  二.内容文件

    在如下情况中不宜使用程序集资源,而是使用应用程序部署文件。

  • 希望改变资源文件,而又不想重新编译应用程序。
  • 资源文件非常大。
  • 资源文件是可选的,并且可以不随程序集一起部署。
  • 资源是声音文件。

    为了能够成功使用内容文件,需要注意两点

  • 将资源的Build Action始终设置为Content
  • 将资源的Copy to Output Directory始终设置为CopyAlways

    使用的时候同程序集使用的是同一套URI方法

Added by HeavenTao,2013/12/18

WPF中资源引用方式汇总的更多相关文章

  1. WPF中静态引用资源与动态引用资源的区别

    WPF中静态引用资源与动态引用资源的区别   WPF中引用资源分为静态引用与动态引用,两者的区别在哪里呢?我们通过一个小的例子来理解. 点击“Update”按钮,第2个按钮的文字会变成“更上一层楼”, ...

  2. WPF 中资源路径的问题

    WPF 中资源路径的问题 1. 引用当前工程的资源(注意xxxx.png的build action 应设置为Resource 或Embedded Resource) <ImageBrush Im ...

  3. WPF中资源的引用方法

    一.引用同一个程序中的资源 1.使用相对Uri来引用资源,如下所示 img.Source=new BitmapImage(new Uri(@"d"\iamges\Backgroun ...

  4. WPF中的常用类汇总:

    1.FrameworkElement: WPF中大部分的控件都可以转化成FrameworkElement,利用FrameworkElement属性获取相应的值: 2.WPF获取当前工作区域的宽度和高度 ...

  5. WPF 中的绑定方式

    1.元素间的绑定 xaml方式 <Slider Name="slider1" Value="20"/>        <TextBlock T ...

  6. vue中组件传值方式汇总

    在应用复杂时,推荐使用vue官网推荐的vuex,以下讨论简单SPA中的组件间传值. 一.路由传值 路由对象如下图所示: 在跳转页面的时候,在js代码中的操作如下,在标签中使用<router-li ...

  7. Android Studio中怎样引用图片资源

    随着不断接触Android Studio,越来越发现和Eclipse有着巨大的差别. 不管是表面的目录结构,还是内在对各种资源的管理. 本篇就来聊聊Android Studio中怎样来显示图片. 以及 ...

  8. Android ImageView 不显示JPEG图片 及 Android Studio中怎样引用图片资源

    Android ImageView 不显示JPEG图片 今天在写一个小实例,ImageView在xml里面设置的是INVISIBLE,在代码里须要设置成setVisibility(View.VISIB ...

  9. How do I duplicate a resource reference in code behind in WPF?如何在WPF后台代码中中复制引用的资源?

    原文 https://stackoverflow.com/questions/28240528/how-do-i-duplicate-a-resource-reference-in-code-behi ...

随机推荐

  1. Android ImageButton图像灰色边框

    灰色边框,是imageButton空间自带的. 第一种解决方案: android:scaleType="fitXY"//这个代码是:拉伸图片(不按比例)以填充的长宽.所以图像最后最 ...

  2. puppet学习笔记(二)

    在puppet安装完成之后我们就可以动手开始第一个puppet实验了,此实验就以批量推送文件为例吧. 1.获取module路径 这里的module就是指一个模块,可以把puppet想象成一个个项目的部 ...

  3. 在Windows2012下配置Mercurial

    所需的安装文件: xampp-win32-1.8.3-4-VC11-installer.exe python-2.7.7.amd64.msi tortoisehg-3.0.1-x64.msi merc ...

  4. Dictionary(HashMap)的实现

    什么是哈希表? 哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构.也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放 ...

  5. POJ 2318 TOYS【叉积+二分】

    今天开始学习计算几何,百度了两篇文章,与君共勉! 计算几何入门题推荐 计算几何基础知识 题意:有一个盒子,被n块木板分成n+1个区域,每个木板从左到右出现,并且不交叉. 有m个玩具(可以看成点)放在这 ...

  6. zstu-3769 数回文子串

    思路:用manacher求出每个位置的半径,相加即可. 代码:[rad[i]/2]即i这个位置的回文半径,添加的'#'代表长度为偶数的串. #include<stdio.h> #inclu ...

  7. linux之间进程通信

    进程间通信方式:                    同主机进程间数据交换机制: pipe(无名管道) / fifo(有名管道)/ message queue(消息队列)和共享内存. 必备基础: f ...

  8. Spring 一二事(2)

    静态工厂方法及实例工厂的使用: applicationContext.xml: <!-- factory-method 是指调用静态工厂方法 --> <bean id="h ...

  9. View (二) 自定义属性

    主要有三种方法可以实现自定义属性. 方法一:不使用命名空间,不使用attrs.xml文件.通过attrs.getAttributeResourceValue方法拿到属性值 方法二: 使用命名空间, 不 ...

  10. C++容器的复制

    C++容器的复制不同于Java Java是引用复制,复制的仅仅是对象的引用, 在需要复制容器内对象的副本集合的情况,需要使用Clone方法,而且要注意clone方法的浅拷贝 深拷贝 C++的容器复制 ...