最近在做一个WPF的应用,我想在WPF的应用中使用资源字典应该是很常见的事情,由于是初次设计这种程序,对WPF也不是很熟悉,不免会遇上一些问题,当然很多也是一些基础的低级的,比如本文将要介绍的“资源字典将如何在不同程序集之间进行共享”的问题就是一个很基础的技术点。在我的应用程序的设计中将资源字典作为程序集单独设计为类库还不是很必要,但我想我们常见的系统中这么做应该是很不错的选择吧,所以,我就很想明白此时我应该怎么做,可是在我从网上查找相关资料时发现这方面的介绍不是很多,而且,介绍的也不够清楚,大多还是很笼统,给的例子也都千篇一律——以我的智商还不能做到被一点即通。于是便查阅了一些书籍,终于在《WPF编程宝典——C# 2010版》中找的较详细的介绍,所以,我想把我学到的做个总结记录下来以供大家参考和我以后的查看。

  我想我这里即将介绍的这个知识对于初始WPF的人应该还是能有帮助的吧,希望如此。至少,我看了书里的介绍还是觉得还是很清楚的,如果我这里的介绍给到家带来困扰了,还希望能够不客气的指出,另外,也可以去看下书中原文(原文写的还是很清楚,条理也很清晰的)。关于资源字典、如何创建和使用资源字典是很简单的,随便查一下资料就能明白了,这里我们还是先关注一下它在不同程序集间的共享。

  如果只是在不同窗体或控件之间共享倒是简单了,关键是怎么能在不同程序集间共享。尤其是大点的项目,我们很有可能需要单独创建一个资源字典的程序集作为资源类库进行共享。那如果是这种情况我们该怎么办呢?除了直接拷贝资源字典的XAML文件并分发以外(当然这不是什么好的选择)我们还有两个办法:1、使用代码创建合适的 ResourceDictionary 对象(这种做法比较直观);2、使用 ComponentResourceKey 标记扩展,该标记扩展也是专门为此设计的。

  一、使用代码创建 ResourceDictionary 对象:

    1、假设资源字典专用类库为 ResourceDictionaryLibrary ,要使用其中的一个资源字典为 ButtonBackgroundDic.xaml 的资源字典,可以使用下面的代码进行访问:

ResourceDictionary resDictionary = new ResourceDictionary();
resDictionary.Source = new Uri("ResourceDictionaryLibrary;component/ButtonBackgroundDic.xaml",UriKind.Relative);

    2、在使用时,我们就可以通过Key来手动检索所需的资源了,如下代码所示(其中 BtnBackgound_SkyBlue 是我要用的资源的 Key ;btn 是我使用该资源的一个 Button ):

this.btn.Background = (Brush)resourceDic["BtnBackgound_SkyBlue"];

    注:

      在上面代码中使用了 pack URI 语法,这里仅作简单介绍,具体语法讲解请查阅相关资料:

      语法格式为 ResourceName(相对URI)或 pack://application:,,,/ResourceName(绝对URI),两种写法是等效的;但对于检索嵌入到其他资源库中的资源时语法格式为 AssemblyName;component/ResourceName(相对URI)或 pack://application:,,,/AssemblyName;component/ResourceName(绝对URI)(如在上述例子中使用的格式为:”AssemblyName;component/ResourceName“)。

  二、使用 ComponentResourceKey 标记扩展:

    如果不想写任何代码,则可以使用 ComponentResourceKey 标记扩展。

    1、使用 ComponentResourceKey 为资源创建键名,这可起到通知 WPF 我们将在程序集之间共享资源。

    2、使用这种方式时,我们务必将资源字典整合到 Generic.xaml 文件中,并且必须将该文件位于 Themes 文件夹中。

      目录结构大概是这样的:ResourceDictionaryLibrary/Themes/Generic.xaml

      更合了资源字典的 Generic.xaml 文件大致是这样的:

<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:ResourceDictionaryLibrary"><ResourceDictionary.MergedDictionaries><!--该资源是要使用在其他程序集中,因此使用下面的 pack URI 语法在其他程序访问该资源时才能正常运行。如果直接指定资源文件名称,则程序将会在自己的资源中查找。--><ResourceDictionary Source="ResourceDictionaryLibrary;component/ButtonBackgroundDic.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary>

    3、为需要共享的资源创建键名。

      使用 ComponentResourceKey 时,需要提供两部分信息:类库程序集中类的引用和描述性的资源ID。类引用是共享资源的关键。当在使用时,需要提供相同的类引用和资源ID。

      该类无所谓定义为什么名,也可以没有任何代码。但是,需要将该类定义到 ComponentResourceKey 将要从中查找资源的程序集(如我们单独创建的资源字典的程序集),比如我将该类定义成如下样子:

public class CustomResources
{
}

    4、使用上面的 CustomResources 类和资源ID创建键名:

x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:CustomResources},ResourceId=BtnBackgound_SkyBlue}"

    5、在其他应用程序中的使用:

  • 在使用的地方定义资源类库程序集的前缀,如下所示:
xmlns:res="clr-namespace:ResourceDictionaryLibrary;assembly=ResourceDictionaryLibrary"

  • 使用包含 ComponentResourceKey 的 DynamicResource 调用资源。此时的 ComponentResourceKey 就是资源类库中定义的 ComponentResourceKey 。如下代码所示:
<Button Name="btn" Background="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type res:CustomResources},ResourceId=BtnBackgound_SkyBlue}}"/>

      注:使用 ComponentResourceKey 时,必须使用动态资源,而不能使用静态资源。

  • 为了简化使用方式,可以在提供资源的类库程序集的类中定义一个静态属性,让其返回正确的 ComponentResourceKey ,如下所示:
public class CustomResources
{

/// <summary>
      /// 属性名不必与 ComponentResourceKey 的 resourceId 相同
      /// </summary>

public static ComponentResourceKey BtnBackgound_SkyBlue{get { return new ComponentResourceKey(typeof(CustomResources), "BtnBackgound_SkyBlue"); }}
}

      此时,可以使用 Static 标记扩展访问该属性了并应用资源了,代码如下:

<Button Name="btn" Background="{DynamicResource {x:Static res:CustomResources.BtnBackgound_SkyBlue}}"/>

转载于:https://www.cnblogs.com/KeSaga/p/4156379.html

资源字典——程序集之间的资源共享相关推荐

  1. wpf 关于程序集间使用资源字典共享资源

    最近学习一些了关于程序集之间共享资源的知识,在这里记录下来. (1)创建 首先是共享资源的创建,创建一个新的"wpf自定义控件"项目,然后随便添加一个图片作为示例资源. 文件结构如 ...

  2. 【WPF学习】第三十五章 资源字典

    如果希望在多个项目之间共享资源,可创建资源字典.资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情. 一.创建资源字典 下面是一个资源字典示例,它包含一个资源: <Resour ...

  3. WPF 资源字典【转】

    使用好处:存储需要被本地话的内容(错误消息字符串等,实现软编码),减少重复的代码,重用样式,实现多个项目之间的共享资源; 修改一个地方所有引用的地方都会被修改,方便统一风格; 使用方法,归纳起来主要有 ...

  4. 避免让WPF资源字典变得杂乱臃肿

    避免让WPF资源字典变得杂乱臃肿 原文: 避免让WPF资源字典变得杂乱臃肿   避免让WPF资源字典变得杂乱臃肿                           周银辉 今天看到项目种的一个XXX ...

  5. WPF中利用DynamicResource动态资源和资源字典实现软件中英文切换

    在一个项目中,有时候会遇到不同国家或地区的软件用户,这样就需要对软件UI界面进行语言翻译,我们可以利用DynamicResource和资源字典来实现这一需求.我们可以将不同的语言字典封装到一个项目中, ...

  6. python中列表字典元组之间的区别_python之字典、元组、列表的区别

    1.列表:专门用于存储一串信息,列表用中括号[]定义,数据之间使用逗号,分隔 list_0=['a','b','c'] 列表的特点: 1)可修改.可增加.可删除 2)列表是有序的,可以遍历 3)可以将 ...

  7. wpf 资源字典中定义FontFamily

    1.引入FontFamily所在程序集: xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/composite-font&quo ...

  8. C#资源文件与与资源名称字符串之间的互相转化

    1.使用ResourceManager string st = Properties.Resources.ResourceManager.GetString(tableName); value = P ...

  9. 计算机网络资源共享实验过程,实验:局域网资源的共享

    一.实验目的: 1.掌握设置共享网络资源的方法. 2.掌握使用共享网络资源的方法. 3.认识组建网络的实用价值. 二.实验说明: 1.组建网络的最终目的就是实现计算机之间的资源共享,享受联网的乐趣. ...

最新文章

  1. java 中对多态的理解
  2. 人工智能基础-机器学习任务之常规解决的六大问题
  3. CGLIB介绍与原理(通过继承的动态代理)
  4. Python基础之最大公约数与最小公倍数
  5. 处女座和小姐姐(二)
  6. Python-条件控制及循环
  7. 关于python中带下划线的变量和函数 的意义
  8. android修改自动背光,Android LCD和键盘 背光亮度设置
  9. C语言第三节关键字、标识符、注释
  10. Notadd —— 基于 nest.js 的微服务开发框架
  11. vi/vim文本编辑器的使用
  12. Atitit.注解解析(1)---------词法分析 attilax总结 java .net
  13. 如何设计会员体系中心
  14. 爬取12306火车票信息
  15. Excel Rate 函数的java 实现,等额本息计算反推利率
  16. 盗QQ号的现在越来越牛B了,我差点被骗!大家要小心了
  17. 洛谷P1007独木桥题解
  18. JavaScrpt LRC歌词同步 和 es6 的 fetch 的 async/await 和 promise 两种写法
  19. CYUSB3014 USB3.0与FPGA设计
  20. android sqlite fts4,FTS4 sqlite MATCH查询不起作用(FTS4 sqlite MATCH query not working)

热门文章

  1. java hashmap 实现 序列化_java – Jackson JSON对象映射器反序列化为LinkedHashMap而不是HashMap...
  2. 自己动手写Docker系列 -- 4.3实现volume数据卷
  3. php 二维数组根据键值合并二维数组_php数组实现根据某个键值将相同键值合并生成新二维数组的方法详解...
  4. 交叉驰豫的影响因素_墨点对uv打印机印刷质量影响
  5. windos 为什么会突然服务停止了_女生为什么会突然说分手?
  6. Spring Boot的RestTemplate 之exchange方法
  7. VsCode配置Python项目的setting.json和launch.json两个配置文件
  8. java telnet 交换机_华为交换机 telnet 配置(极简版)
  9. linux6 rac 11g,oracle linux 6.操作系统oracle 11g rac
  10. 查询出两个表中不同的数据