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实现负载均衡,最常用 ...
随机推荐
- zz 李治国:地图大战本质是争抢O2O入口
导航免费,这一天早该到来了!高德.百度免费之争,其实也是为了抢占生活服务这一最关键的入口,从而获得该战场的翻盘机会. 导航地图免费,实则是生活服务的入口之争.我在08年时就在阿里内部讲过这个事,并建议 ...
- WebGIS基础复习笔记
明天要考试了,突击一下. 1.万维网:www是world wide web的简称是在超文本基础上形成的信息网 2.互联网:即广域局域网及单机按照一定的通讯协议组成的国际计算机网络 3.WebGIS:网 ...
- 日程管理控件 glDatePicker
之前接触过一款日程管理控件,叫 FullCalendar,功能很强大,会列出每天的事项,可选择编辑并且可以定制自己的日历,然而,有时候,我们的网页上只需要一个简单的日历,迷你但实用,有日程安排的日期高 ...
- Linux SCSI回调IO的分析
本文转载自:http://blog.csdn.net/xushiyan/article/details/6941640,如需参考,请访问原始链接地址. 没找到如何转载的入口,只好全文copy了. -- ...
- c++ primer (5)1
第一章 1.包含来自标准库的头文件用<>,不属于标准库用"". 2.默认情况,读cin会刷新cout:程序非正常终止时也会刷新cout. 3.默认情况,cerr不缓冲, ...
- 重学C++ (1)
写在开头的话:这学期没有写太多的代码,终于把中英文两篇论文弄完了,趁着中间的空隙,想想找工作的处境.自己也定了自己的方向.不管学什么语言吧,每个语言都有自己的优势和使用的群体.只要自己是良马,终会有伯 ...
- WCF、Web API、WCF REST、Web Service之区别
http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-R ...
- 常用mysql命令大全
常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再 ...
- apache配置网站目录的读写权限
分享下apache中配置网站目录文件权限的方法. 假设http服务器运行用户和用户组是www,网站用户为centos,网站根目录是/home/centos/web. 操作方法与步骤:1,首先,设定网站 ...
- web一次请求的流程
1.客户端(浏览器输入网址)请求 2.发送http协议到web服务器(nginx),检测请求类别,如果时纯静态页面,则返响应返回给客户端. 3.如果有动态脚本(php语法)启动fastcgi进程,用解 ...