分类: WPF 2012-10-28 10:57 1162人阅读 评论(0) 收藏 举报

以下介绍如何创建可用于在多个程序集之间共享的资源字典

1.新建Wpf自定义控件库,名称为MyContorlLib,项目资源结构图如下:

2.打开Themes文件夹中的Generic.xaml文件,在根元素中添加如下名称空间:
xmlns:local="clr-namespace:MyContorlLib"
因为待会儿要用到该名称空间下的一个类CustomControl1(系统自动生成的,也可以自己创建)
3.在资源字典中添加资源:

  1. <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:CustomControl1}, ResourceId=haha}" StartPoint="0,0" EndPoint="0,1">
  2. <GradientStop Color="Blue" Offset="0"></GradientStop>
  3. <GradientStop Color="White" Offset="0.5"></GradientStop>
  4. <GradientStop Color="Red" Offset="0.7"></GradientStop>
  5. <GradientStop Color="Firebrick" Offset="1"></GradientStop>
  6. </LinearGradientBrush>
<LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:CustomControl1}, ResourceId=haha}" StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="Blue" Offset="0"></GradientStop>
<GradientStop Color="White" Offset="0.5"></GradientStop>
<GradientStop Color="Red" Offset="0.7"></GradientStop>
<GradientStop Color="Firebrick" Offset="1"></GradientStop>
</LinearGradientBrush>

重点在这里,注意看x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:CustomControl1}, ResourceId=haha}",可以发现它跟我们在Window.Resources或Application.Resources或其他元素中定义的x:Key的方式略有区别;
解释一下:
x:Key不再是字符串,而是一个更加复杂的类型ComponentResourceKey,它有三个属性TypeInTargetAssembly、ResourceId、Assembly,我们这里用到了前面两个;
TypeInTargetAssembly属性需要接收一个Type类型的值,我们赋予{x:Type local:CustomControl1};
ResourceId需要接收一个字符串,名字随便取,这里赋予haha(没有什么含义,有含义最好)

这样就为资源元素定义好了Key,下面就是在另一个程序集中应用它了.
略述步骤如下:

1.创建WPF项目,名称为WpfAPP;
2.创建一个Window窗口,名称为resTest;
3.添加程序集引用,具体是右击"引用"-->"添加"-->"项目"-->"MyControlLib"-->"确定"
4.打开resTest.xaml文件,向根元素添加名称空间:
  xmlns:res="clr-namespace:MyContorlLib;assembly=MyControlLib"
  注意与上面的写法略有不同(具体的原因我也不好解释,好像上面的名称空间也可以写成这样)
5.添加一个Label元素,为其Background属性赋值如下:
Background="{DynamicResource ResourceKey={ComponentResourceKey TypeInTargetAssembly={x:Type res:CustomControl1}, ResourceId=haha}}"
 这里我们用到了原先为资源元素定义好的Key,是个ComponentResourceKey,包含两个必要的属性.
6.工作完成.

还有一步额外但是很有趣的操作:
1.打开CustomControl1.cs文件;
2.添加一个静态公开的ComponentResourceKey类型的属性:

  1. public static ComponentResourceKey LinearGradientColorBrushKey {
  2. get { return new ComponentResourceKey(typeof(CustomControl1),"haha"); }
  3. }
 public static ComponentResourceKey LinearGradientColorBrushKey {
get { return new ComponentResourceKey(typeof(CustomControl1),"haha"); }
}

3.这样我们也可以获得资源,我们重新为Label的Background属性赋值:
Background="{DynamicResource ResourceKey={x:Static Member=res:CustomControl1.LinearGradientColorBrushKey}}"
4.也有相同的效果.

下面来解决在这个过程中可能遇到的问题:
Undefined CLR namespace. The 'clr-namespace' URI refers to a namespace 'MyControlLib' that is not included in the assembly.
也就是“未定义的CLR名称空间,......”类的错误
其实如果按照上面说的做逻辑上没有错误,但是VS或Blend总要提醒本错误,原因就是:
我们没有“重新构建”或“重新生成”MyControlLib程序集,重新生成一下试试吧,会成功的。
至于为何要“重新生成”,我想用不着我多解释把吧,自己想想也就明白了。

wpf多程序集之间共享资源字典--CLR名称空间未定义云云的更多相关文章

  1. wpf 在引用外部的资源字典

    启动的APP.xaml

  2. WPF学习笔记-使用自定义资源字典(style)文件

    1.添加资源字典文件style.xmal 2.在资源字典中添加自定义style等 <ResourceDictionary xmlns="http://schemas.microsoft ...

  3. WPF(MVVM) 利用资源字典实现中英文动态切换

    1.首先新建两个字典文件en-us.xaml.zh-cn.xaml.定义中英文的字符串在这里面. 2.将两个资源字典添加到App.xaml中,这里注意下,因为两个字典中有同样字符,如果没有动态更改,默 ...

  4. python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间

    一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...

  5. k8s核心资源之:名称空间(ns)

    简介 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或者用户组. 常见的pod.service.replicaSet和deployment等都是属于某一个namespac ...

  6. (转载)资源字典(Pro WPF 学习)

    原地址:http://www.cnblogs.com/yxhq/archive/2012/07/09/2582508.html 1.创建资源字典 下面是一个资源字典(AppBrushes.xaml), ...

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

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

  8. Prism 4 文档 ---第10章 Silverlight和WPF之间共享代码

        本主题帮助你理解来自Prism的多目标和它的优缺点.多目标的代码针对两个不同的平台有大致相同的代码库.这允许同时保持代码尽可能多一样能够产生针对两种不同技术的二进制文件.在这种情况下,本节介绍 ...

  9. 同一个POD中默认共享哪些名称空间

    如果通过POD的形式来启动多个容器那么它们的名称空间会是共享的么,所以我这里讨论是在默认情况下同一个POD的不同容器的哪些名称空间是打通的.这里先说一下结论,共享的是UTS.IPC.NET.USER. ...

随机推荐

  1. 在VM虚拟机中安装Centos7操作系统(三)

    首先我们要下载  Centos https://www.centos.org/ 这个是Centos官方 最新版本 7 https://www.centos.org/download/ 提供有 DVD安 ...

  2. 数据库时间类型和 util 包下时间类型转换

    Java 中的类型 1. java.sql 包下给出三个数据库相关的日期时间类型,分别是 java.sql.Date, 表示日期,只有年月日,没有时分秒. java.sql.Time, 表示时间, 只 ...

  3. js验证表单大全1

    附加:js验证radio是否选择 <script language="javascript"> function checkform(obj) { for(i=0;i& ...

  4. CF145E Lucky Queries

    CF145E Lucky Queries 英文题面不放了,直接上翻译: 题目描述 给你n个数,每个数是4或者7,给你m个任务完成 switch l r 把[l,r]位置的4换成7,7换成4 count ...

  5. Python3.6全栈开发实例[009]

    9.字典dic,dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}a.请循 ...

  6. Java基础—String总结

    特点 String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. String实 ...

  7. (扫盲)DTO数据传输对象

    DTO即数据传输对象.但从定义上看就是简单的用来传递数据的.主要用途是在框架中定义DTO来绑定表现层中的数据.学过MVC.EF实体模型的都应该知道,我们可以定义一个Model实体来实现前后台数据的交互 ...

  8. LVM逻辑磁盘管理

    一.简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵 ...

  9. ruby rails 安裝

    安装之前先更换Ubuntu的源 https://www.cnblogs.com/znsongshu/p/9452067.html   http://gems.ruby-china.org/   一/安 ...

  10. SOA 面向服务架构 阅读笔记(五)

    14 SOA 服务管理器 契约:契约中必须明确定义双方的责任,否则就会产生混乱. SOA可以管理端到端的流程. IT技术一直是与业务对齐的. 14.1.1 分解IT层 业务服务层 管道层 硬件层 管道 ...