避免让WPF资源字典变得杂乱臃肿
避免让WPF资源字典变得杂乱臃肿
周银辉
今天看到项目种的一个XXXResource.xaml文件代码有二千多行,这引发了我一些思考:如何组织我们的WPF资源。在WPF中可以有很多种组织资源的方式,下面分别介绍:
1,每个元素维持自己的资源。拥有Resources属性的对象有很多种类型,比如Application、Window、Page、Style、FrameworkTemplate、FrameworkElement、FrameworkContentElement等。在这种模式种每种元素维持自己所需要的资源,而不顾忌资源是否可以共享,比如两个Button:
<Button x:Name="btn1"
Content="button 1"
Foreground="{DynamicResource redBrush}">
<Button.Resources>
<SolidColorBrush x:Key="redBrush" Color="Red"/>
</Button.Resources>
</Button>
<Button x:Name="btn2"
Content="button 2"
Foreground="{DynamicResource redBrush}">
<Button.Resources>
<SolidColorBrush x:Key="redBrush" Color="Red"/>
</Button.Resources>
</Button>
这造成的问题是,资源不能共享而重复创建一些相同的资源影响效率。
2,提高资源共享率。我们可以将共享的资源转移更高的层次中,以便底层次的元素可以直接引用这些资源,而不必各自重新创建,比如:
<StackPanel>
<StackPanel.Resources>
<SolidColorBrush x:Key="redBrush" Color="Red"/>
</StackPanel.Resources>
<Button x:Name="btn1"
Content="button 1"
Foreground="{DynamicResource redBrush}">
</Button>
<Button x:Name="btn2"
Content="button 2"
Foreground="{DynamicResource redBrush}">
</Button>
</StackPanel>
我们将redBrush移动到了两个Button的公共父亲StackPanel中,这样他们就可以同时引用了。
但通常情况下,为了更大范围的共享,我们会将很多Resoureces移动到Window(或Page)甚至App范围内。
但随着资源的增多,如果我们将这些资源都塞进一个XAML文件中,那么我们的XAML文件将变得非常的臃肿(比如一不小心就几千行,其阅读性将变得很差,并且要想快速导航到欲查找的资源也不容易)。为此,我们得考虑如何重新组织我们的资源来解决这个问题。
一种可行的方式是将Resource按照类型来划分到不同的ResourceDictionary文件中,然后使用MergedDictionaries来合并各个资源字典。在进行分组之前所有的资源都在同一个资源字典中,如下图:
我们按照不同的类型分组后(Brushes,DataTemplates,Styles,Converters等等,每一种类型对应一个资源字典,这样资源字典就被拆分得比较小了),如下图:
然后在将这些字典合并成一个字典来使用:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources"Brushes.xaml"/>
<ResourceDictionary Source="Resources"Styles.xaml"/>
<ResourceDictionary Source="Resources"DataTemplates.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
这样一个明显的好处是,让我们资源组织得更加的结构化,更好的查找和维护,更适合程序员的观点。但其明显的一个缺点是Blend的Resource目录面板对您多建立的资源的多级目录结构表现得不明显,不能展现目标的多层结构而展现成一个平面结构,导致你不在区分不同文件夹下的同名资源文件时又些不方便(但,你可以把鼠标移动到文件上,其Tooltip会显示各自的完整路径来区分),如下图:
避免让WPF资源字典变得杂乱臃肿的更多相关文章
- [WPF]资源字典——程序集之间的资源共享 简单换皮肤
直接上代码,已便已后自己查况阅,新手也可以看! 1.新建一个资料类和一个WPF工程 2.APP.XAML应该资源字典,注意应Source格式,前面一定要有“/” <ResourceDiction ...
- WPF 资源字典
使用好处:存储需要被本地话的内容(错误消息字符串等,实现软编码),减少重复的代码,重用样式,实现多个项目之间的共享资源;修改一个地方所有引用的地方都会被修改,方便统一风格; 使用方法,归纳起来主要有下 ...
- WPF资源字典的使用【转】
资源字典出现的初衷就在于可以实现多个项目之间的共享资源,资源字典只是一个简单的XAML文档,该文档除了存储希望使用的资源之外,不做任何其它的事情. 1. 创建资源字典 创建资源字典的过程比较简单,只 ...
- WPF 资源字典【转】
使用好处:存储需要被本地话的内容(错误消息字符串等,实现软编码),减少重复的代码,重用样式,实现多个项目之间的共享资源;修改一个地方所有引用的地方都会被修改,方便统一风格;使用方法,归纳起来主要有下面 ...
- WPF资源字典
如果相同的资源可用于不同的应用程序,把资源放在一个资源字典中就比较有效. 新建一个资源字典文件Dictionary1.xaml <ResourceDictionary xmlns="h ...
- WPF资源字典使用
资源字典出现的初衷就在于可以实现多个项目之间的共享资源,资源字典只是一个简单的XAML文档,该文档除了存储希望使用的资源之外,不做任何其它的事情. 1. 创建资源字典 创建资源字典的过程比较简单,只 ...
- VS2015创建类库项目后添加不了WPF资源字典,窗口,用户控件处理办法
打开项目工程文件在PropertyGroup标签最后加上下面3行: <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FA ...
- WPF资源字典的使用
1.在解决方案中添加资源字典:鼠标右键——添加——资源字典 2.在资源字典中写入你需要的样式,我这里简单的写了一个窗体的边框样式 3.在App.xaml中加入刚刚新建的资源字典就好了
- VS2017创建类库项目后添加不了WPF资源字典
第一步: 先找到你需要添加的库类工程文件,位置如下: 第二步: 使用记事本文件打开,找到图片的位置,把三行代码粘贴进去,保存文件.重新打开项目: 三行代码如下: <ProjectTypeGuid ...
随机推荐
- 细说CSS伪类和伪元素
原文 简书原文:https://www.jianshu.com/p/eae56b7fe7fe 大纲 1.伪元素 2.伪类元素 3.伪元素和伪类元素的区别 4.伪类和伪元素的使用 1.伪元素 伪元素在D ...
- https://github.com/mvf/svn_wfx
https://github.com/mvf/svn_wfx 2003.net对应的vc是7.0版本.需要更高的. 在哪里可以下载呢 https://www.tjupt.org/没有校外种子 Proj ...
- 浅谈struts2的国际化----i18n
可能大家在使用struts框架的时候,偶尔会看到这个词: i18n.也就是 Internationalization i 开头,n 结尾. 总共18个字母,今天的主要内容就是环绕这 四个字母. ...
- [Angular Directive] 3. Handle Events with Angular 2 Directives
A @Directive can also listen to events on their host element using @HostListener. This allows you to ...
- Android中的动画详解系列【2】——飞舞的蝴蝶
这一篇来使用逐帧动画和补间动画来实现一个小例子,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包括下面几个子类: AlphaAnimation ...
- c3p0 xml配置文件模版
<c3p0-config> <default-config> <property name="driverClass">com.mysql.jd ...
- 微信开发之八 页面获取周围beacon设备
原文链接:https://blog.csdn.net/qq_37936542/article/details/78912197 --注意:微信测试号不具备这个功能 步骤一:绑定域名 注意不要加ht ...
- JNDI 的理解
JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的一个,不少专家觉得,没有透彻理解JNDI的意义和作用 ...
- ios开发总结,日常开发:ios开发功能收集,经验分享等等(不断更新中。。。)
github资料学习和下载地址:https://github.com/niexiaobo/MyDailyDevelopmentNotes ios 学习模块 ios APP 日志管理的重要性: 一个功能 ...
- B/S系统的前台和后台数据转递机制探究
作者:朱金灿 来源:http://blog.csdn.net/clever101 说实话写这篇文章超出了我的能力范围之外(因为我并没有多少Web开发经验),我所期待的是能起一个抛砖引玉的作用--希望高 ...