论WPF资源的重要性:为什么我们需要理解它?

WPF 资源

  • WPF(Windows Presentation Foundation)资源系统是一种管理和重用一系列有用对象的方法,这些对象可以包括常用的画刷、样式或模板等。资源系统在WPF中非常重要,它简化了标记,减少了重复的编码,并且允许在中央位置存储用户界面的细节,使得修改变得更容易。在WPF中,资源可以定义在代码中,也可以在XAML标记中定义。通常,XAML标记中定义资源是最常见的做法。一旦定义了一个资源,就可以在窗口中标记的所有其他部分使用该资源。这种技术使得代码更加精简,更加高效。

什么是WPF资源

  • 一般是使用 WPF 资源作为重用通常定义的对象和值的简单方法。

窗体级资源

  • 是定义在特定窗体范围内的资源,仅对该窗体实例有效。这些资源可以通过窗体的Resources属性进行定义和添加,它们可以是样式、画刷、数据模板等,用于自定义窗体的外观和行为。
  • 下面写个例子
 <Window.Resources>
     <!--创建一个单色画刷-->
     <SolidColorBrush x:Key="myBrush" Color="Orange" />
 </Window.Resources>
 <Grid>
     <Grid.RowDefinitions>
         <RowDefinition></RowDefinition>
         <RowDefinition></RowDefinition>
     </Grid.RowDefinitions>
     <!--给按钮设置背景颜色-->
     <Button Grid.Row="0" Margin="5" Height="50" Width="400" Content="我是按钮,背景颜色使用了资源里对象SolidColorBrush" Background="{StaticResource myBrush}" />
      <!--给矩形填充颜色-->
     <Rectangle Grid.Row="1" Margin="5" Width="200" Height="200" Fill="{StaticResource myBrush}" />
 </Grid>

对象资源

应用程序级资源

  • 是定义在整个应用程序范围内的资源,可以在应用程序的任何位置重复使用。这些资源通常在应用程序的入口点(例如App.xaml文件)中定义,并存储在Application.Resources集合中。
  • 下面写个例子
// 在App.xaml文件里
 <Application.Resources>
     <!--创建一个全局单色画刷-->
     <SolidColorBrush x:Key="myGlobalBrush" Color="DodgerBlue" />
 </Application.Resources>

// 另外一个窗体里也定义个窗体级资源
<Window.Resources>
    <!--创建一个单色画刷-->
    <SolidColorBrush x:Key="myBrush" Color="Orange" />
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <!--给按钮设置背景颜色-->
    <Button Grid.Row="0" Margin="5" Height="50" Width="400" Content="我使用了局部窗体级资源里对象SolidColorBrush" Background="{StaticResource myBrush}" />

    <!--给按钮设置背景颜色-->
    <Button Grid.Row="1" Margin="5" Height="50" Width="400" Content="我使用了程序级资源里对象SolidColorBrush" Background="{StaticResource myGlobalBrush}" />
</Grid>

应用程序级资源

文件级资源

-是一种组织和管理资源的方式,允许将资源集中定义在一个位置,并在整个应用程序中重复使用。资源字典通常包含在XAML文件中,并使用ResourceDictionary元素进行定义。

    • 下面截图如何添加资源字典
      添加Resource Dictionary
      t添加保存
// 这里字典资源
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <!--创建一个单色画刷-->
    <SolidColorBrush x:Key="myResourceDictionaryBrush" Color="Red" />
    <!--定义一个样式,样式背景颜色引用上面的画刷-->
    <Style x:Key="MyResourceDictionaryStyle" TargetType="Button">
        <Setter Property="Background" Value="{StaticResource myResourceDictionaryBrush}"/>
        <Setter Property="FontSize" Value="16"/>
    </Style>

</ResourceDictionary>
// 这里是窗体,注册字典资源
<Window.Resources>
    <!--引入字典资源-->
    <ResourceDictionary Source="SolidColorBrushResource.xaml"/>
</Window.Resources>
<Grid>
    <!--给按钮设置背景颜色-->
    <Button Margin="5" Height="50" Foreground="White" Width="400" Content="我背景颜色和字体大小使用了字典资源里的Style" Style="{StaticResource  MyResourceDictionaryStyle}" />

</Grid>

文件级资源

对象(控件)级资源

  • 是指与特定控件关联的资源,这些资源仅在该控件内部使用。与窗体级资源不同,对象(控件)级资源仅对该控件实例有效,不会被其他控件共享。
  • 下面写个例子
<Grid>
    <Button x:Name="myButton" Content="我使用了控件级资源"  Margin="5" Height="50" Width="400"  >
        <Button.Resources>
            <!--设置背景颜色和字体颜色,最后在设置个字体大小-->
            <SolidColorBrush x:Key="myButtonBrush" Color="Blue" />
            <Style x:Key="myButtonStyle" TargetType="Button">
                <Setter Property="Background" Value="{StaticResource myButtonBrush}"/>
                <Setter Property="Foreground" Value="White"/>
                <Setter Property="FontSize" Value="16"/>
            </Style>
        </Button.Resources>
        <Button.Style>
            <StaticResource ResourceKey="myButtonStyle"/>
        </Button.Style>
    </Button>
</Grid>

控件级别资源

静态资源(StaticResource)和动态资源(DynamicResource)

  • 在WPF中,资源可以通过StaticResource和DynamicResource标记来使用。这两者的主要区别在于它们处理资源的方式和绑定的方式不同。
  • StaticResource标记用于绑定到一个静态的资源,它会在编译时进行解析,并将资源值注入到属性中。这意味着一旦资源被绑定,它们就会像普通的属性值一样被处理,并且不会在运行时发生变化。
  • DynamicResource标记则用于绑定到一个动态资源,它会在运行时动态解析资源。这意味着绑定的资源值可以在运行时更改,并且每次属性值改变时都会重新计算绑定的值。
  • 下面写个例子
<Window.Resources>
    <!--设置背景颜色画刷-->
    <SolidColorBrush x:Key="myButtonBlueBrush" Color="Blue" />

    <SolidColorBrush x:Key="myButtonRedBrush" Color="Red" />

    <SolidColorBrush x:Key="myButtonOrangeBrush" Color="Orange" />

    <SolidColorBrush x:Key="myButtonYellowBrush" Color="Yellow" />
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <!--定于三个动态资源背景的按钮,可以切换背景颜色  DynamicResource标记-->
    <Button x:Name="myButtonBlue" Grid.Row="0" Width="200" Height="50" Margin="5" Content="我是按钮蓝色" FontSize="16" Foreground="White" Background="{DynamicResource myButtonBlueBrush}" />

    <Button x:Name="myButtonRed" Grid.Row="1" Width="200" Height="50" Margin="5" Content="我是按钮红色"  FontSize="16" Foreground="White" Background="{DynamicResource myButtonRedBrush}" />

    <Button x:Name="myButtonOrange" Grid.Row="2" Width="200" Height="50" Margin="5" Content="我是按钮橘色"  FontSize="16" Foreground="White" Background="{DynamicResource myButtonOrangeBrush}" />

    <!--定义个静态资源的按钮,用来点击切换动态按钮背景颜色   StaticResource标记-->
    <Button Grid.Row="3" Width="200" Height="50" Margin="5" Content="点击我动态改变资源颜色"  FontSize="16" Background="{StaticResource myButtonYellowBrush}"  Click="Button_Click"/>
</Grid>
using System.Windows;
using System.Windows.Media;

namespace WpfResourceApp
{
    /// <summary>
    /// StaticDynamicResource.xaml 的交互逻辑
    /// </summary>
    public partial class StaticDynamicResource : Window
    {
        private static bool dynamicResourceStatus=false;
        public StaticDynamicResource()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //改变资源
            //定义三个不同颜色的画刷
            SolidColorBrush brushGreen = dynamicResourceStatus==true? new SolidColorBrush(Colors.Blue): new SolidColorBrush(Colors.Green);
            SolidColorBrush brushIndigo = dynamicResourceStatus == true ? new SolidColorBrush(Colors.Red): new SolidColorBrush(Colors.Indigo);
            SolidColorBrush brushViolet = dynamicResourceStatus == true ? new SolidColorBrush(Colors.Orange): new SolidColorBrush(Colors.Violet);

            //改变资源
            Application.Current.Dispatcher.Invoke(() =>
            {
                this.myButtonBlue.Resources["myButtonBlueBrush"] = brushGreen;
                this.myButtonRed.Resources["myButtonRedBrush"] = brushIndigo;
                this.myButtonOrange.Resources["myButtonOrangeBrush"] = brushViolet;
            });
            dynamicResourceStatus=!dynamicResourceStatus;
        }
           
    }
}


静态和动态资源

公众号“点滴分享技术猿

关注

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Windows Presentation Foundation (WPF) 是.NET Framework 3.0 的关键组件,是支持下一代视窗应用程序表现层编程的平台,也是微软新发布的Vista操作系统的三大核心开发库之一,主要负责图形显示。本书是针对那些对用户界面开发感兴趣的软件开发人员编写的,易于理解,适合那些.NET的新手,并有助于理解像Microsoft Expression Blend这样产品的精髓。   本书适合各层次Web开发人员阅读。 第一部分 背景 第1章 为什么创造WPF    1.1 回顾过去    1.2 步入WPF    1.3 作为.NET Framework的组成部分     1.3.1 为托管代码而设计     1.3.2 强调声明式描述    1.4 小结   第2章 XAML揭秘    2.1 XAML定义    2.2 元素和特性    2.3 命名空间    2.4 属性元素    2.5 类型转换器    2.6 标记扩展    2.7 对象元素的子元素     2.7.1 内容属性     2.7.2 集合项     2.7.3 更多类型转换    2.8 编译:将XAML与过程式代码混合使用     2.8.1 在运行时加载和解析XAML     2.8.2 编译XAML     2.8.3 XAML关键字    2.9 小结     2.9.1 抱怨1:XML太过冗长不便于输入     2.9.2 抱怨2:基于XML的系统性能差   第3章 WPF的重要新概念    3.1 逻辑树与可视树    3.2 依赖属性     3.2.1 依赖属性的实现     3.2.2 变更通知     3.2.3 属性值继承     3.2.4 对多个提供程序的支持     3.2.5 附加属性    3.3 路由事件     3.3.1 路由事件的实现     3.3.2 路由策略和事件处理程序     3.3.3 路由事件实践     3.3.4 附加事件    3.4 命令     3.4.1 内建命令     3.4.2 使用输入手势执行命令     3.4.3 带有内建命令绑定的控件    3.5 漫游类层次    3.6 小结  第二部分 构建WPF应用程序  第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、模板、皮肤和主题 233 第四部分 通过富媒体使程序领先于时代  第11章 2D图形   第12章 3D图形   第13章 动画   第14章 音频、视频、语音和文档  第五部分 高级主题  第15章 与Win32、Windows Form以及ActiveX之间的互用性   第16章 用户控件和自定义控件   第17章 使用自定义面板做布局  第六部分 附录 附录 有用的工具 
Windows Presentation Foundation (WPF) 是.NET Framework 3.0 的关键组件,是支持下一代视窗应用程序表现层编程的平台,也是微软新发布的Vista操作系统的三大核心开发库之一,主要负责图形显示。本书是针对那些对用户界面开发感兴趣的软件开发人员编写的,易于理解,适合那些.NET的新手,并有助于理解像Microsoft Expression Blend这样产品的精髓。   本书适合各层次Web开发人员阅读。 第一部分 背景 第1章 为什么创造WPF    1.1 回顾过去    1.2 步入WPF    1.3 作为.NET Framework的组成部分     1.3.1 为托管代码而设计     1.3.2 强调声明式描述    1.4 小结   第2章 XAML揭秘    2.1 XAML定义    2.2 元素和特性    2.3 命名空间    2.4 属性元素    2.5 类型转换器    2.6 标记扩展    2.7 对象元素的子元素     2.7.1 内容属性     2.7.2 集合项     2.7.3 更多类型转换    2.8 编译:将XAML与过程式代码混合使用     2.8.1 在运行时加载和解析XAML     2.8.2 编译XAML     2.8.3 XAML关键字    2.9 小结     2.9.1 抱怨1:XML太过冗长不便于输入     2.9.2 抱怨2:基于XML的系统性能差   第3章 WPF的重要新概念    3.1 逻辑树与可视树    3.2 依赖属性     3.2.1 依赖属性的实现     3.2.2 变更通知     3.2.3 属性值继承     3.2.4 对多个提供程序的支持     3.2.5 附加属性    3.3 路由事件     3.3.1 路由事件的实现     3.3.2 路由策略和事件处理程序     3.3.3 路由事件实践     3.3.4 附加事件    3.4 命令     3.4.1 内建命令     3.4.2 使用输入手势执行命令     3.4.3 带有内建命令绑定的控件    3.5 漫游类层次    3.6 小结  第二部分 构建WPF应用程序  第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、模板、皮肤和主题 233 第四部分 通过富媒体使程序领先于时代  第11章 2D图形   第12章 3D图形   第13章 动画   第14章 音频、视频、语音和文档  第五部分 高级主题  第15章 与Win32、Windows Form以及ActiveX之间的互用性   第16章 用户控件和自定义控件   第17章 使用自定义面板做布局  第六部分 附录 附录 有用的工具 
Windows Presentation Foundation (WPF) 是.NET Framework 3.0 的关键组件,是支持下一代视窗应用程序表现层编程的平台,也是微软新发布的Vista操作系统的三大核心开发库之一,主要负责图形显示。本书是针对那些对用户界面开发感兴趣的软件开发人员编写的,易于理解,适合那些.NET的新手,并有助于理解像Microsoft Expression Blend这样产品的精髓。   本书适合各层次Web开发人员阅读。 第一部分 背景 第1章 为什么创造WPF    1.1 回顾过去    1.2 步入WPF    1.3 作为.NET Framework的组成部分     1.3.1 为托管代码而设计     1.3.2 强调声明式描述    1.4 小结   第2章 XAML揭秘    2.1 XAML定义    2.2 元素和特性    2.3 命名空间    2.4 属性元素    2.5 类型转换器    2.6 标记扩展    2.7 对象元素的子元素     2.7.1 内容属性     2.7.2 集合项     2.7.3 更多类型转换    2.8 编译:将XAML与过程式代码混合使用     2.8.1 在运行时加载和解析XAML     2.8.2 编译XAML     2.8.3 XAML关键字    2.9 小结     2.9.1 抱怨1:XML太过冗长不便于输入     2.9.2 抱怨2:基于XML的系统性能差   第3章 WPF的重要新概念    3.1 逻辑树与可视树    3.2 依赖属性     3.2.1 依赖属性的实现     3.2.2 变更通知     3.2.3 属性值继承     3.2.4 对多个提供程序的支持     3.2.5 附加属性    3.3 路由事件     3.3.1 路由事件的实现     3.3.2 路由策略和事件处理程序     3.3.3 路由事件实践     3.3.4 附加事件    3.4 命令     3.4.1 内建命令     3.4.2 使用输入手势执行命令     3.4.3 带有内建命令绑定的控件    3.5 漫游类层次    3.6 小结  第二部分 构建WPF应用程序  第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、模板、皮肤和主题 233 第四部分 通过富媒体使程序领先于时代  第11章 2D图形   第12章 3D图形   第13章 动画   第14章 音频、视频、语音和文档  第五部分 高级主题  第15章 与Win32、Windows Form以及ActiveX之间的互用性   第16章 用户控件和自定义控件   第17章 使用自定义面板做布局  第六部分 附录 附录 有用的工具 
Windows Presentation Foundation (WPF) 是.NET Framework 3.0 的关键组件,是支持下一代视窗应用程序表现层编程的平台,也是微软新发布的Vista操作系统的三大核心开发库之一,主要负责图形显示。本书是针对那些对用户界面开发感兴趣的软件开发人员编写的,易于理解,适合那些.NET的新手,并有助于理解像Microsoft Expression Blend这样产品的精髓。   本书适合各层次Web开发人员阅读。 第一部分 背景 第1章 为什么创造WPF    1.1 回顾过去    1.2 步入WPF    1.3 作为.NET Framework的组成部分     1.3.1 为托管代码而设计     1.3.2 强调声明式描述    1.4 小结   第2章 XAML揭秘    2.1 XAML定义    2.2 元素和特性    2.3 命名空间    2.4 属性元素    2.5 类型转换器    2.6 标记扩展    2.7 对象元素的子元素     2.7.1 内容属性     2.7.2 集合项     2.7.3 更多类型转换    2.8 编译:将XAML与过程式代码混合使用     2.8.1 在运行时加载和解析XAML     2.8.2 编译XAML     2.8.3 XAML关键字    2.9 小结     2.9.1 抱怨1:XML太过冗长不便于输入     2.9.2 抱怨2:基于XML的系统性能差   第3章 WPF的重要新概念    3.1 逻辑树与可视树    3.2 依赖属性     3.2.1 依赖属性的实现     3.2.2 变更通知     3.2.3 属性值继承     3.2.4 对多个提供程序的支持     3.2.5 附加属性    3.3 路由事件     3.3.1 路由事件的实现     3.3.2 路由策略和事件处理程序     3.3.3 路由事件实践     3.3.4 附加事件    3.4 命令     3.4.1 内建命令     3.4.2 使用输入手势执行命令     3.4.3 带有内建命令绑定的控件    3.5 漫游类层次    3.6 小结  第二部分 构建WPF应用程序  第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、模板、皮肤和主题 233 第四部分 通过富媒体使程序领先于时代  第11章 2D图形   第12章 3D图形   第13章 动画   第14章 音频、视频、语音和文档  第五部分 高级主题  第15章 与Win32、Windows Form以及ActiveX之间的互用性   第16章 用户控件和自定义控件   第17章 使用自定义面板做布局  第六部分 附录 附录 有用的工具 
Windows Presentation Foundation (WPF) 是.NET Framework 3.0 的关键组件,是支持下一代视窗应用程序表现层编程的平台,也是微软新发布的Vista操作系统的三大核心开发库之一,主要负责图形显示。本书是针对那些对用户界面开发感兴趣的软件开发人员编写的,易于理解,适合那些.NET的新手,并有助于理解像Microsoft Expression Blend这样产品的精髓。   本书适合各层次Web开发人员阅读。 第一部分 背景 第1章 为什么创造WPF    1.1 回顾过去    1.2 步入WPF    1.3 作为.NET Framework的组成部分     1.3.1 为托管代码而设计     1.3.2 强调声明式描述    1.4 小结   第2章 XAML揭秘    2.1 XAML定义    2.2 元素和特性    2.3 命名空间    2.4 属性元素    2.5 类型转换器    2.6 标记扩展    2.7 对象元素的子元素     2.7.1 内容属性     2.7.2 集合项     2.7.3 更多类型转换    2.8 编译:将XAML与过程式代码混合使用     2.8.1 在运行时加载和解析XAML     2.8.2 编译XAML     2.8.3 XAML关键字    2.9 小结     2.9.1 抱怨1:XML太过冗长不便于输入     2.9.2 抱怨2:基于XML的系统性能差   第3章 WPF的重要新概念    3.1 逻辑树与可视树    3.2 依赖属性     3.2.1 依赖属性的实现     3.2.2 变更通知     3.2.3 属性值继承     3.2.4 对多个提供程序的支持     3.2.5 附加属性    3.3 路由事件     3.3.1 路由事件的实现     3.3.2 路由策略和事件处理程序     3.3.3 路由事件实践     3.3.4 附加事件    3.4 命令     3.4.1 内建命令     3.4.2 使用输入手势执行命令     3.4.3 带有内建命令绑定的控件    3.5 漫游类层次    3.6 小结  第二部分 构建WPF应用程序  第4章 WPF控件   第5章 尺寸缩放、定位与变换元素   第6章 使用面板做布局   第7章 构建并部署应用程序  第三部分 为专业开发人员设计的功能  第8章 资源   第9章 数据绑定   第10章 样式、模板、皮肤和主题 233 第四部分 通过富媒体使程序领先于时代  第11章 2D图形   第12章 3D图形   第13章 动画   第14章 音频、视频、语音和文档  第五部分 高级主题  第15章 与Win32、Windows Form以及ActiveX之间的互用性   第16章 用户控件和自定义控件   第17章 使用自定义面板做布局  第六部分 附录 附录 有用的工具 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖的工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值