wpf多程序集之间共享资源字典--CLR名称空间未定义云云

wpf多程序集之间共享资源字典--CLR名称空间未定义云云

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

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

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

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

[html] view plaincopyprint?

  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类型的属性:

[html] view plaincopyprint?

  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程序集,重新生成一下试试吧,会成功的。
至于为何要“重新生成”,我想用不着我多解释把吧,自己想想也就明白了。

时间: 2024-10-09 22:48:56

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

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

1.添加资源字典文件style.xmal 2.在资源字典中添加自定义style等 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfTest.resources&

wpf 在引用外部的资源字典

启动的APP.xaml 资源字典: ScrollViewStyle.xaml 引用的界面的xaml <UserControl x:Class="FranceNews.Pages.点位.Views.FranceFilter" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/

【WPF学习】第三章 使用其他名称空间中的类型

前面已经介绍了如何在XAML中使用WPF中的类来创建基本的用户界面.但XAML是实例化.NET对象的通用方法,包括那些位于其他非WPF名称空间以及自己创建的名称空间中的对象. 创建那些不是用于在XAML窗口中显示的对象听起来像是多余的,但在很多情况下这是需要的.一个例子是,但使用数据绑定并希望在某个控件上显示从其他对象提取的信息时.另外一个例子是希望使用非WPF对象为WPF对象设置属性时. 例如,可使用数据对象填充WPF的ListBox控件.ListBox控件将调用ToString()方法来获取

资源字典——程序集之间的资源共享

最近在做一个WPF的应用,我想在WPF的应用中使用资源字典应该是很常见的事情,由于是初次设计这种程序,对WPF也不是很熟悉,不免会遇上一些问题,当然很多也是一些基础的低级的,比如本文将要介绍的“资源字典将如何在不同程序集之间进行共享”的问题就是一个很基础的技术点.在我的应用程序的设计中将资源字典作为程序集单独设计为类库还不是很必要,但我想我们常见的系统中这么做应该是很不错的选择吧,所以,我就很想明白此时我应该怎么做,可是在我从网上查找相关资料时发现这方面的介绍不是很多,而且,介绍的也不够清楚,大

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

原文:[WPF学习]第三十五章 资源字典 如果希望在多个项目之间共享资源,可创建资源字典.资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情. 一.创建资源字典 下面是一个资源字典示例,它包含一个资源: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/wi

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

本主题帮助你理解来自Prism的多目标和它的优缺点.多目标的代码针对两个不同的平台有大致相同的代码库.这允许同时保持代码尽可能多一样能够产生针对两种不同技术的二进制文件.在这种情况下,本节介绍的技术是WPF和Silverlight.本主题包含了一些你在使用这些技术开发多目标应用程序的时候的注意事项. 目标和有点 当在编写具有相似功能和能力的WPF和Silverlight应用程序的时候,努力使用一个代码库很有意义.尽管WPF和Silverlight平台非常相似,但他们只有有限的二进制兼容性.仅Si

一种对共享资源和独享资源的检查方法

一种对共享资源和独享资源的检查方法 1. 背景 当程序的子模块数量和规模扩大之后,在开发阶段,系统长时间允许后经常会碰到下面一些bug: 内存泄漏.随着时间允许,系统可用的内存越来越少,最后kernel 出现oom 错误: 文件句柄耗尽.程序可以打开的文件.套接字.管道越来越少,最后出错在用完了最后一个可用句柄的代码附近: 死锁.线程拥有一把锁A,正在申请锁B:但在此时锁B被另外一个线程拥有,且那个线程又在申请锁A.形成一个循环等待.占用且不可释放的状态. 调试这些问题,当然可以从代码流程和逻辑

WPF名称空间

一 C#名称空间 C#中,将类组织在合适的名称空间中,这样便可以在不同的名称空间中创建同名的类,而在使用同名类时,需要指定类是属于哪一个名称空间,以此来区别不同的同名类.这就像,1班有一个"张伟",2班也有一个"张伟",为了区分这两个同名的"张伟",必须加上"1班的"或者"2班的"限定条件一样,名称空间就是此处用来区别同名"张伟"的限定条件,它的作用就是避免同名的冲突. 下面通过一个简单

WPF合并资源字典

1.合并多个外部资源字典成为本地字典 示例代码 <Page.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="myresourcedictionary1.xaml"/> <ResourceDictionary Source="myresourcedictionary2.xam