原文:避免让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资源字典变得杂乱臃肿的更多相关文章

  1. [WPF]资源字典——程序集之间的资源共享 简单换皮肤

    直接上代码,已便已后自己查况阅,新手也可以看! 1.新建一个资料类和一个WPF工程 2.APP.XAML应该资源字典,注意应Source格式,前面一定要有“/” <ResourceDiction ...

  2. WPF 资源字典

    使用好处:存储需要被本地话的内容(错误消息字符串等,实现软编码),减少重复的代码,重用样式,实现多个项目之间的共享资源;修改一个地方所有引用的地方都会被修改,方便统一风格; 使用方法,归纳起来主要有下 ...

  3. WPF资源字典的使用【转】

    资源字典出现的初衷就在于可以实现多个项目之间的共享资源,资源字典只是一个简单的XAML文档,该文档除了存储希望使用的资源之外,不做任何其它的事情. 1.  创建资源字典 创建资源字典的过程比较简单,只 ...

  4. WPF 资源字典【转】

    使用好处:存储需要被本地话的内容(错误消息字符串等,实现软编码),减少重复的代码,重用样式,实现多个项目之间的共享资源;修改一个地方所有引用的地方都会被修改,方便统一风格;使用方法,归纳起来主要有下面 ...

  5. WPF资源字典

    如果相同的资源可用于不同的应用程序,把资源放在一个资源字典中就比较有效. 新建一个资源字典文件Dictionary1.xaml <ResourceDictionary xmlns="h ...

  6. WPF资源字典使用

    资源字典出现的初衷就在于可以实现多个项目之间的共享资源,资源字典只是一个简单的XAML文档,该文档除了存储希望使用的资源之外,不做任何其它的事情. 1.  创建资源字典 创建资源字典的过程比较简单,只 ...

  7. VS2015创建类库项目后添加不了WPF资源字典,窗口,用户控件处理办法

    打开项目工程文件在PropertyGroup标签最后加上下面3行: <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FA ...

  8. WPF资源字典的使用

    1.在解决方案中添加资源字典:鼠标右键——添加——资源字典 2.在资源字典中写入你需要的样式,我这里简单的写了一个窗体的边框样式 3.在App.xaml中加入刚刚新建的资源字典就好了

  9. VS2017创建类库项目后添加不了WPF资源字典

    第一步: 先找到你需要添加的库类工程文件,位置如下: 第二步: 使用记事本文件打开,找到图片的位置,把三行代码粘贴进去,保存文件.重新打开项目: 三行代码如下: <ProjectTypeGuid ...

随机推荐

  1. 使用XX-Net永久访问真正的互联网

    XX-Net基于GoAgent(代理软件),使用谷歌App Engine(GAE)代理服务器通过防火墙,是github上的一个开源项目. https://github.com/XX-net/XX-Ne ...

  2. 使用perl读取Excel

    使用perl读取Excel 环境 windows 7 ActiveState Perl Win32::OLE[perl package] 基本功能 循环处理多个sheet 读取Excel单元,提取in ...

  3. Lucene学习总结之六:Lucene打分公式的数学推导 2014-06-25 14:20 384人阅读 评论(0) 收藏

    在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数. Lucene ...

  4. RMAN之一:快速入门 分类: H2_ORACLE 2014-02-17 16:11 689人阅读 评论(0) 收藏

    1.数据导出基础 (1)创建datapump导出文件的目录对象并为相应用户授予权限. 出于安全考虑,不允许oracle用户直接在OS上进行文件的操作,而应通过directory对象指定. SQL> ...

  5. [Angular Testing] Unit Testing -- Test component and service.

    Recommend to use angular-cli to generate component and service, so we can get testing templates. ng ...

  6. oracle 中日期的加减

    oracle 中日期的加减 加法   select sysdate,add_months(sysdate,12) from dual;        --加1年 select sysdate,add_ ...

  7. 【计算机视觉】OpenCV中直方图处理函数简述

    计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列提前定义的bins中.这里的数据不只指的是灰度值 ,统计数据可能是不论什么能有效描写叙述图像的特征. 如果有一个矩阵包括 ...

  8. Qt 通过绘画设置边框阴影

    首先widget设置 setWindowFlags(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground, true) ...

  9. android 连接USB按power键锁屏2声锁屏音

    alps\frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardViewMediator.java #1384 行左右: ...

  10. color2gray 的实现

    无论是 rgb 还是 yuv 等三通道的颜色空间中的像素点,将其转换为单通道(pixel_depth=255.)中的像素,一般情况下都是采用的对原始颜色空间的 3 通道的像素点线性组合而得到单通道的像 ...