WPF跨程序集共享样式(跨程序集隔离样式和代码)
前记:WPF中的样式使用一般分为两种Statci和Dynamic.两者的区别可以理解为,前者在运行的时候已经确定了样式的风格,而后者可以根据资源在运行时的修改而修改也可以使用那些在运行时才存在的资源。
背景:有时候我们会将样式的资源和XAML页面代码分离,有时候也希望同一个资源可以在多个Application中使用;另外还有一个更致命的问题,如果我们在很多地方都写了重复的样式,突然有一天我们要修改,那岂不是要一个一个地方进行修改,那工作量实在不敢想象。好在WPF中提供了解决这个问题的好方法,那就是ComponentResourceKey(定义或引用基于外部程序集中的类名以及一个附加标识符的资源键。),也就是说我们可以指定一个统一的Key(并不是我们之前使用的),来绑定同一个资源。
发功(此功一共分为3步):
1.定义一个ComponentResourceKey需要的类型,如下:
public class CustomResources
{
public static ComponentResourceKey DesertBrushKey
{
get
{
return new ComponentResourceKey(
typeof(CustomResources), "DesertBrush");
}
}
}
类名随意,其实类中可以没有东西,我们的内容稍后解释。
2.添加generic.xaml文件(如果你有可以忽略)、添加资源(直接写Dictionary字典或者直接写在generic.xaml中)
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication9">
<ImageBrush
x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:CustomResources},ResourceId=DesertBrush}"
ImageSource="/WpfApplication9;component/Desert.jpg"></ImageBrush>
</ResourceDictionary>
添加对命名空间的引用,然后写一个ImageBrush样式资源。关键来了,Key不是一个字符串,而是一个很复杂的不知道什么东东的东东。
解释: 关于Key设置的语法,往下看,在这里我们使用的是详细版的语法,ComponentResourceKey固定关键字,TypeInTargetAssembly即为我们创建的类型(x:Type为WPF提供的),ResourceID就是之前我们习惯设置的Key(名称随意)。
XAML设置键,精简版:
<object x:Key="{ComponentResourceKey {x:Type targetTypeName}, targetID}" .../>
XAML设置键,详细版:
<object x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type targetTypeName}, ResourceID=targetID}" .../>
请求资源,精简版:
<object property="{DynamicResource {ComponentResourceKey {x:Type targetTypeName}, targetID}}" .../>
请求资源,详细版:
<object property="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type targetTypeName}, ResourceID=targetID}}" .../>
注意:generic.xaml路径为Themes/generic.xaml
3.使用资源
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:res="clr-namespace:WpfApplication9;assembly=WpfApplication9"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Background="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type res:CustomResources}, ResourceId=DesertBrush}}"></Button>
</Grid>
</Window>
上述XAML文件和资源不在同一个程序,所以首先添加对上一个程序的引用,然后在XAML中添加对命名空间的引用,然后在Button的Background上使用我们的资源。
解释:资源的使用语法见上文,ComponentResoruceKey固定关键字,TypeInTargetAssembly也是我们创建的类,最后ResourceId同样为我们在资源中定义的ResourceId。
说在最后:其实本文还没完,还有很有用的一点,是不是觉得使用方式很复杂,是不是觉得类中的代码到底是干嘛的呢,开始解答。
鉴于使用资源的方法过于繁琐,可以在类中添加一个静态的属性类型同样为ComponentResoruceKey,返回值为实例化的ComponentResoruceKey,第一个参数为我们的类的类型,第二个参数为资源中的ResourceId的值,然后你就可以这么使用:
<Button Background="{DynamicResource {x:Static res:CustomResources.DesertBrushKey}}"></Button>
原谅我在最后才拿出简单的使用方法,我也是为大家好呢。
WPF跨程序集共享样式(跨程序集隔离样式和代码)的更多相关文章
- session跨域共享解决方案
要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域? 一.传递session_id有4 ...
- 通过jsonp解决浏览器的跨域共享
因为浏览器的同源策略,普通ajax访问跨域请求返回的json数据是不会被浏览器接受的.看下面例子可以看出是访问不到的 首先 定义webapi 后台代码 public class JsopControl ...
- JavaScript最全的10种跨域共享的方法
在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和 ...
- 在ExpressJS中设置二级域名跨域共享Cookie
问题:我使用expressjs和mongostore来管理session.下面是expressjs中的设置. app.configure(function(){ app.use(express.ses ...
- 如何实现session跨服务器共享
Session共享有多种解决方法,常用的有四种:客户端Cookie保存.服务器间Session同步.使用集群管理Session.把Session持久化到数据库. 1.客户端Cookie保存 以cook ...
- 使用Spring Session和Redis解决分布式Session跨域共享问题
http://blog.csdn.net/xlgen157387/article/details/57406162 使用Spring Session和Redis解决分布式Session跨域共享问题
- cookie用法小结 cookie.setPath 跨域共享
1. JSP中Cookie的读写 Cookie的本质是一个键值对,当浏览器访问web服务器的时候写入在客户端机器上,里面记录一些信息.Cookie还有一些附加信息,比如域名.有效时间.注释等等. 下面 ...
- 跨域共享cookie和跨域共享session
转载自:http://blog.csdn.net/ahhsxy/article/details/7356128 这里所说的跨域,是指跨二级域名,而且这些域名对应的应用都在同一个app上, 比如我有以下 ...
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
随机推荐
- Shell 循环读取文件
使用Shell将Windows环境下的文件拷贝到Linux下面的用法. 在linux下,将dos文件格式转换成linux文件格式的用法,vi打开,然后转到命令格式,执行,然后保存,就可以转换成linu ...
- JAVA_SE复习(Class)
一.面向对象程序设计(OOP) 1.面向对象的程序设计是程序开发的一种方法.它将对象作为程序的基本单元,将程序和 数据封装其中,以提高软件的重用性.灵活性和扩展性 2.三个特征: 封装:隐藏信息 继承 ...
- jquery.ajax中的ifModified参数的误解
原来以为ifModified是为了在AJAX请求是发送 If-Modified-Since头,让服务端返回304. 测试代码如下: $(function () { test(); window.set ...
- JavaScript正则实战
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- 同时存在两个或多个homestead 虚拟box
开发中发现,不同版本的homestead 里面的环境各不相同,里面的node,npm等版本都不一致,如果需要添加 不同版本的homestead同时存在可以按照以下办法处理. tips: 提供可以离线下 ...
- oracle中的decode的使用
含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN R ...
- 《WPF程序设计指南》读书笔记——第8章 依赖属性
1.依赖属性的效果 一旦规定视觉树上一个对象的fontsize属性,那么属于他的节点之下的所有对象都会沿袭这个属性,然而如果某个子节点明确的设定了自己的fontsize,就不会沿袭父节点的fontsi ...
- SYN, FIN, ACK, PSH, RST, URG
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN表示建立连 ...
- C语言-创建链表及排序
#include <stdio.h> #define NEWNODE (Node *)malloc(sizeof(Node)) typedef struct mynode{ int num ...
- HDFS知识体系 思维导图