注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

避免让WPF资源字典变得杂乱臃肿.txt  

2009-08-18 18:15:31|  分类: DotNet |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天看到项目种的一个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范围内。

2009年8月18日 - 乂乂 - 一个人,一支烟  ·~~


但随着资源的增多,如果我们将这些资源都塞进一个XAML文件中,那么我们的XAML文件将变得非常的臃肿(比如一不小心就几千行,其阅读性将变得很差,并且要想快速导航到欲查找的资源也不容易)。为此,我们得考虑如何重新组织我们的资源来解决这个问题。

一种可行的方式是将Resource按照类型来划分到不同的ResourceDictionary文件中,然后使用MergedDictionaries来合并各个资源字典。在进行分组之前所有的资源都在同一个资源字典中,如下图:

2009年8月18日 - 乂乂 - 一个人,一支烟  ·~~

我们按照不同的类型分组后(Brushes,DataTemplates,Styles,Converters等等,每一种类型对应一个资源字典,这样资源字典就被拆分得比较小了),如下图:

2009年8月18日 - 乂乂 - 一个人,一支烟  ·~~

然后在将这些字典合并成一个字典来使用:

      <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会显示各自的完整路径来区分),如下图:

2009年8月18日 - 乂乂 - 一个人,一支烟  ·~~

【from 周银辉 http://www.cnblogs.com/zhouyinhui/archive/2008/01/21/1047504.html

  评论这张
 
阅读(577)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017