前记: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>

原谅我在最后才拿出简单的使用方法,我也是为大家好呢。

转载于:https://www.cnblogs.com/ListenFly/p/3273069.html

WPF跨程序集共享样式(跨程序集隔离样式和代码)相关推荐

  1. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  2. JavaScript最全的10种跨域共享的方法

    在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和 ...

  3. tplink 跨路由器 共享打印机_焦作联通案例分享:跨网段通过防火墙共享打印机设置...

    跨网段通过防火墙共享打印机设置 焦作联通网络部:薛培延 两个不同的局域网间如何实现打印机共享操作呢?以下将与大家分享一下处于同一个路由器连接下(即处于同一个域中的计算机之间)不同局域网段之间打印机共享 ...

  4. PHP解决http和https跨域,php中http与https跨域共享session的解决方法

    这篇文章主要介绍了http与https跨域共享session的解决方法,需要的朋友可以参考下 遇到了HTTP.HTTPS协议下session共享解决cookie失效的问题,这里提供一个临时解决办法. ...

  5. JavaScript的10种跨域共享的方法

    在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和 ...

  6. 第七章:跨程序共享数据-探究内容提供器

    运行时权限 Android 6.0 之后的系统提供了两种权限: 普通权限.例如:访问网络状态.监控开机是否完成等.这种权限会在安装 APP 时询问用户是否同意. 危险权限,也就是说运行时权限,需要在程 ...

  7. 使用Spring Session和Redis解决分布式Session跨域共享问题

    大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...

  8. 用FileMapping跨进程共享数据

    FileMapping貌似是Windows唯一提供的跨进程共享数据的方法.如果将客户端的资源文件单独创建一个资源进程,则本机开启的多个客户端都可以使用该资源进程获取资源,这样,很容易使大型3D游戏支持 ...

  9. session跨域共享解决方案

    session跨域共享解决方案 参考文章: (1)session跨域共享解决方案 (2)https://www.cnblogs.com/sustudy/p/5332584.html 备忘一下.

最新文章

  1. 数据结构 - 二叉树的广度优先遍历算法(C++)
  2. Oracle学习:多表查询与子查询
  3. OpenCV运动去模糊滤波器
  4. 复合索引在什么情况下使用
  5. mysql like_MySQL LIKE:模糊查询
  6. 前端基础-html-图片标签
  7. 流行的9个Java框架介绍:优点、缺点等等
  8. Java CAS无锁技术深度解析
  9. flask 模板 php,Flask 模板系统
  10. Python菜鸟入门:day09数据结构
  11. IDEA中启动tomcat
  12. Git 的BUG小结
  13. QTP的那些事--打开脚本文件弹出“unexpected file format”错误
  14. FLTK学习笔记3-随机点名器
  15. [Python]ImportError: This platform lacks a functioning sem_open implementation, therefore, the requi
  16. 前端常用PS技巧总结之更换图片背景颜色
  17. 典型无线复习资料---有这不怕挂科
  18. Duke的咆哮语录②:我求求你们跟我学一下代码“分层”吧!
  19. 百度谷歌搜索引擎研究,如何做SEO优化?网站优化实操(程序员必看)
  20. 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解

热门文章

  1. Vue中的join(),reverse()与 split()函数
  2. java 获取 classpath下的配置文件
  3. C++ string字符串的增删改查
  4. 那些年做过的 .NET Web 项目和 iOS 之路的一些思考
  5. Mysql学习笔记(一)数据类型
  6. 数据结构与算法之一快速排序
  7. java工程窗口程序_java工程开发之图形化界面之(第二课)
  8. c语言双向链表的作用,C语言实现双向链表
  9. c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)
  10. Hello HarmonyOS,HarmonyOS鸿蒙实现HelloWorld应用开发E2E体验