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实现负载均衡,最常用 ...
随机推荐
- java计时器
//用于计时,要求xx秒后开始发送短信,短信之间间隔xx秒 public static Date dateOperateBySecond(Date date,int second){ Calendar ...
- WiFi安全之WPA介绍
WPA,全称为Wi-Fi Protected Access,是一种保护WiFi安全的系统,实现了IEEE 802.11i的大部分标准,是一种替代WEP的过渡方案. 这个协议包含了前向兼容RC4的加密协 ...
- [CSS]三角形
CSS盒子模型 当我们把padding和width,height全部设置为0,border设为一个较大的像素时 即:我们需要什么方向的三角形,只需把其余的三角形背景色设置为transparent:
- 开发问题记录——ArcEngine问题记录
ArcEngine 使用Winform进行坐标投影变换,用到AE空间,出现如下错误: “ESRI.ArcGIS.esriSystem.IXMLSerialize”在未被引用的程序集中定义.必须添加 ...
- 菜鸟聊:PHP
学习PHP已经有2个月时间了,从一开始的一片空白,到现在的刚刚入门,我对PHP的了解也有更多的认知,希望通过我对PHP的理解,能帮助到更多像我一样的新手更早的认识PHP.(PS:以下内容的一部分是摘自 ...
- 淘宝IP地址库采集器c#代码
这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下. 最近做一个项目,功能类似于CNZZ站长统计功能,要求显示Ip所在的省份市区/提供商等信息.网上的Ip纯真数据库,下载下来一看 ...
- java 中的this关键字的几种用法
转自:http://blog.csdn.net/anmei2010/article/details/4091227 1. 当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在 ...
- bootstrap IE兼容
<meta name="viewport" content="width=device-width, initial-scale=1"> & ...
- WPF中让TextBlock每一个字符显示不同的颜色
XAML代码: <TextBlock x:Name="tb"> <Run Foreground="Red">R</Run> ...
- Kinetic使用注意点--image
new Image(config) 参数: config:包含所有配置项的对象. { image: "图片对象", crop: "图片裁剪对象", fill: ...