原文:避免让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. x265探索与研究(四):怎样编码视频?

    怎样编码视频?           本文介绍x265中的两种编码视频方法,一是採用命令行的方法.二是GUI的方式.   1.命令行的方法   (1).第一种方式生成*.265格式的视频文件       ...

  2. web.xml(8)_jsp-config

    13.jsp-config jsp-config元素主要用来设定JSP的相关配置,<jsp:config>包含<taglib>和<jsp-property-group&g ...

  3. Windows Phone 8.1 联系人与日历

    (1)联系人(Manifest 获取权限) 1)获取联系人 获取联系人的方式有两种 A. ContactPicker ContactPicker 也就是直接打开一个系统的选择联系人界面,让用户选择,可 ...

  4. Spring ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别

    http://www.lai18.com/content/9755931.html Spring 容器(Spring 的上下文) https://my.oschina.net/jast90/blog/ ...

  5. [RxJS] Use RxJS mergeMap to map and merge high order observables

    Like RxJS switchMap() is a shortcut for map() and switch(), we will see in this lesson how mergeMap( ...

  6. Android 比较两个时间段是否有交集或重复

    先看一个例图: 在金山<电池管家>应用中就有一个类似上图这样的功能—— 开启多个定时任务. 当开启另一个定时任务的时候,如果即将开启的这个定时任务的时间段与已经开启了的定时任务的时间段有交 ...

  7. vimrum

    # Insert your preferred key mappings here.unmap <a-O>map <a-O> closeOtherTabsmap , previ ...

  8. 走进windows编程的世界-----窗体的注冊及创建

    1   窗体注冊和创建 1.1WIN32 窗体程序创建步骤 1.WinMain入口函数的定义 2.WindowProc函数的定义 3.注冊窗体类 RegisterClass.RegisterClass ...

  9. erlang浅谈

    优点: 1.面向并发,有成熟而且久经考验的框架可供使用,网络部分已经经过了良好封装 2.内存缓存解决方案进程字典,前者的读写速度是50NS-100Ns级别的 3.对二进制数据解析的语法是直观,简单,强 ...

  10. WM_NOTIFY消息流程实例分析

    我们以CListCtrl控件为例来分析WM_NOTIFY消息. CListCtrl控件在Report样式下会包含CHeaderCtrl标头控件,即CHeaderCtrl标头控件为CListCtrl控件 ...