避免让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会显示各自的完整路径来区分),如下图:
最新文章
- 过年7天乐,学nodejs 也快乐
- jQuery队列操作
- linux无线配置
- URL参数GB2312和UTF-8编码 自动识别
- 一个应用层的Makefile
- c# 配置文件之configSections配置(三)
- Android图片缓存的框架ImageLoader的使用
- 发布Restful服务时出现IIS 指定了身份验证方案错误时的解决方案(IIS specified authentication schemes)
- BackgroundWorker组件
- Asp.Net运行原理(=)
- .NET DataGrid 导出Excel 无分页
- C# 基础知识 (三).主子对话框数值传递
- Java中parse()和valueOf(),toString()的区别
- raise
- STM32定时器时间的计算方法
- ios 拉伸图片和计算文字的大小
- 来自工厂的 PCB 封装建议
- Entity Framework之深入分析
- BZOJ 1010: [HNOI2008]玩具装箱toy(斜率优化dp)
- 类里面的非static const成员
热门文章
- 【solr基础教程之九】客户端 分类: H4_SOLR/LUCENCE 2014-07-30 15:28 904人阅读 评论(0) 收藏
- Lucene学习总结之五:Lucene段合并(merge)过程分析 2014-06-25 14:20 537人阅读 评论(0) 收藏
- LinearLayout的一些注意事项 分类: H1_ANDROID 2013-10-26 23:01 856人阅读 评论(0) 收藏
- 翻译 | Qt研发副总裁分享2018年工作计划
- ios开发事件处理之:一:UIView的拖拽
- ag
- [Ramda] Count Words in a String with Ramda&#39;s countBy and invert
- [SVG] Add an SVG as an Embedded Background Image
- amazeui中内置的web组件有哪些且如何用
- 移动端iPhone系列适配问题的一些坑