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

简介: 原文:避免让WPF资源字典变得杂乱臃肿                   避免让WPF资源字典变得杂乱臃肿                           周银辉 今天看到项目种的一个XXXResource.xaml文件代码有二千多行,这引发了我一些思考:如何组织我们的WPF资源。
原文: 避免让WPF资源字典变得杂乱臃肿

                   避免让WPF资源字典变得杂乱臃肿
                           周银辉

今天看到项目种的一个XXXResource.xaml文件代码有二千多行,这引发了我一些思考:如何组织我们的WPF资源。在WPF中可以有很多种组织资源的方式,下面分别介绍:

1,每个元素维持自己的资源。拥有Resources属性的对象有很多种类型,比如ApplicationWindowPageStyleFrameworkTemplateFrameworkElementFrameworkContentElement等。在这种模式种每种元素维持自己所需要的资源,而不顾忌资源是否可以共享,比如两个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来合并各个资源字典。在进行分组之前所有的资源都在同一个资源字典中,如下图:

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

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

      <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>

这样一个明显的好处是,让我们资源组织得更加的结构化,更好的查找和维护,更适合程序员的观点。但其明显的一个缺点是BlendResource目录面板对您多建立的资源的多级目录结构表现得不明显,不能展现目标的多层结构而展现成一个平面结构,导致你不在区分不同文件夹下的同名资源文件时又些不方便(但,你可以把鼠标移动到文件上,其Tooltip会显示各自的完整路径来区分),如下图:


 

 

目录
相关文章
|
3月前
|
开发框架 缓存 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
|
3月前
|
开发者 C# 存储
WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
92 0
|
3月前
|
C#
WPF 静态资源(StaticResource)和动态资源(DynamicResource)
WPF 静态资源(StaticResource)和动态资源(DynamicResource)
124 0
|
C# 数据格式 XML
WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树) 一、WPF对象级(Window对象)资源的定义与查找 实例一: StaticR...
8441 0
|
6月前
|
C#
浅谈WPF之样式与资源
WPF通过样式,不仅可以方便的设置控件元素的展示方式,给用户呈现多样化的体验,还简化配置,避免重复设置元素的属性,以达到节约成本,提高工作效率的目的,样式也是资源的一种表现形式。本文以一个简单的小例子,简述如何设置WPF的样式以及资源的应用,仅供学习分享使用,如有不足之处,还请指正。
122 0
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
|
C#
WPF资源字典怎么用
资源字典的使用方法
234 0
WPF资源字典怎么用
|
C#
WPF中的一个bug造成CPU资源拉满
WPF中的一个bug造成CPU资源拉满
207 0
|
C# 前端开发 .NET
WPF中的资源简介、DynamicResource与StaticResource的区别
原文:WPF中的资源简介、DynamicResource与StaticResource的区别 什么叫WPF的资源(Resource)?资源是保存在可执行文件中的一种不可执行数据。在WPF的资源中,几乎可以包含图像、字符串等所有的任意CLR对象,只要对象有一个默认的构造函数和独立的属性。
1307 0
|
C#
How do I duplicate a resource reference in code behind in WPF?如何在WPF后台代码中中复制引用的资源?
原文 https://stackoverflow.com/questions/28240528/how-do-i-duplicate-a-resource-reference-in-code-behind-in-wpf 如何在WPF后台代码中中复制引用的资源? In my application, I have a color resources.
833 0