返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解WPF中的对象资源
  • 919
分享到

详解WPF中的对象资源

2024-04-02 19:04:59 919人浏览 独家记忆
摘要

目录资源定义好之后,再使用时,可以指定以静态的方式使用资源,还是以动态的方式使用资源。资源我们都会使用了,接下来需要归类整理我们的资源,使用资源字典:跨程序集使用资源:这个对象资源跨

  在WPF中,所有继承自FrameworkElement的元素都包含一个Resources属性,这个属性就是我们这篇要讲的资源。

  这一篇讲解的资源是不是上一篇的程序集资源(那个是在编译过程中打包到程序集中),这个是资源是我们想在公共的地方写一个对象让其他元素重复使用。

  先贴个例子:


<Window x:Class="NETResource.MainWindow"
        xmlns="Http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlfORMats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:NETResource"0
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <SolidColorBrush x:Key="RedBrushButtonBackground" Color="Red" />
    </Window.Resources>
    <Grid>
        <Grid.Resources>
            <SolidColorBrush x:Key="BlueBrushButtonBackground" Color="Blue"/>
        </Grid.Resources>
        <StackPanel>
            <Button Width="120" Background="{StaticResource RedBrushButtonBackground}" Content="我是按钮A"/>
            <Button Width="120" Background="{StaticResource BlueBrushButtonBackground}" Content="我是按钮B"/>
        </StackPanel>
    </Grid>
</Window>

显示效果:

从例子中我们看几个资源的关键点,我们再Window元素和Grid元素下添加两个颜色画刷资源,使用x:key标识。上面2个Button都使用了2个不同层级的父元素资源。WPF中有个设计比较好的地方就是元素可以使用父元素的资源。这样我们都把资源放在Window节点下,公用这些资源。

资源定义好之后,再使用时,可以指定以静态的方式使用资源,还是以动态的方式使用资源。

差别就是静态资源只从资源集合获取对象一次,对象的任何变化都会得到消息,而动态资源每次需要用到对象时都会重新从资源集合中查找对象。注意动态资源是每次需要用到对象时才会去资源集合查找,所以在资源非常大,且非常复杂的时候,可以用动态资源的方式可以提高第一次加载窗口的速度(因为没有解析资源标记的过程),其他任何使用都不建议使用动态资源。使用数据绑定去实现。


<Window x:Class="NETResource.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:NETResource"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800">
    <Window.Resources>
        <SolidColorBrush x:Key="ButtonBrushBackground" Color="DarkBlue"/>
    </Window.Resources>
    <Grid> 
        <StackPanel Width="120">
            <Button Content="按钮A静态资源" Background="{StaticResource ButtonBrushBackground}"/>
            <Button Content="按钮B动态资源" Background="{DynamicResource ButtonBrushBackground}"/>
            <Button Content="点击切换资源对象" Click="SetButtonBackgroudButton_OnClicked"/>
            <Button Content="点击修改资源的值" Click="UpdataButtonBackgroundButton_OnClicked"/>
        </StackPanel>
    </Grid>
</Window>

using System.windows;
using System.Windows.Media;

namespace NETResource
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        private void SetButtonBackgroudButton_OnClicked(object sender, RoutedEventArgs e)
        {
            //修改资源指向的对象。只有动态资源会受到影响,因为动态资源每次使用值的时候,都会重新读取。静态资源不会,所以静态资源不受影响。
            //修改样式1
            SolidColorBrush brush = new SolidColorBrush(Colors.Red);
            brush.Opacity = 0.3;
            this.Resources["ButtonBrushBackground"] = brush;
            //修改样式2
            // LinearGradientBrush linear = new LinearGradientBrush(Colors.Red, Colors.Blue, 90.0);
            // this.Resources["ButtonBrushBackground"] = linear;
        }

        private void UpdataButtonBackgroundButton_OnClicked(object sender, RoutedEventArgs e)
        {
            //修改资源对象的值,资源没有改变,只是改变了资源的值,所以2个按钮都受到影响。
            var brush = this.Resources["ButtonBrushBackground"];
            if (brush is SolidColorBrush solidColorBrush)
            {
                solidColorBrush.Color = Colors.LightBlue;
            }
        }
    }
}

如果有些资源是所有窗体都共享的,建议写在Application的.Resources下。


<Application x:Class="NETResource.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:NETResource"
             StartupUri="Window1.xaml">
    <Application.Resources>
        <SolidColorBrush x:Key="TitleBrush" Color="Red"/>
    </Application.Resources>
</Application>

<Window x:Class="NETResource.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:NETResource"
        mc:Ignorable="d" 
        Title="WPF教程九:理解WPF中的资源"  
        Height="450" Width="800">
    
    <Window.Resources>
        <SolidColorBrush x:Key="ButtonBrushBackground" Color="DarkBlue"/>
    </Window.Resources>
    <Grid>
        <TextBlock Text="WPF教程九:理解WPF中的资源"  Foreground="{StaticResource TitleBrush}"/>    
    </Grid>
</Window>

资源我们都会使用了,接下来需要归类整理我们的资源,使用资源字典:

我们在工程上右键=》添加=》资源字典=》设置名字为AppBrushes.xaml=》保存

添加代码如下:


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:NETResource">
    <SolidColorBrush x:Key="DictionaryTitleBrush" Color="Beige"/>
</ResourceDictionary>

在App.xaml中添加对资源字典的使用:


<Application x:Class="NETResource.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:NETResource"
             StartupUri="Window1.xaml">
    <Application.Resources> 
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="AppBrushes.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            <SolidColorBrush x:Key="TitleBrush" Color="Red"/>
        </ResourceDictionary>  
    </Application.Resources>
</Application>

这样资源字典就可以被访问了。

我们创建一个button按钮使用资源字典内的样式


  <Button Content="使用资源字典下的画刷" Background="{StaticResource DictionaryTitleBrush}"/>

跨程序集使用资源:这个对象资源跨程序集使用。

一定要分清楚,什么是二进制资源(程序集资源持久化),什么是对象资源(公共部分重复使用的对象)。我们手动创建引用其他库的资源字典。

 在新建资源DLL的时候,我没有找到直接新建添加引用之后的类库,所以我用以下2种方法种的一种来创建程序集,我使用的是第一种:

1)创建WPF程序,然后删除他下面的App.config、App.xaml、MainWindow.xaml 和Properties下的Rsources.resx、Settings.settings,工程右键=》属性=》应用程序=》输出类型=》类库。用于保留自动对PresentationCore、PresentationFramlework、WindowsBase的引用。

2)添加类库程序,然后添加=》引用=》PresentationCore、PresentationFramlework、WindowsBase。这三个的引用。

添加DLL完毕后,在窗体程序中添加对DLL库的引用。整个目录引用关系结构如下: 

现在开始写代码,

首先是ResourceLibrary库。这个是我们的资源库,里面存放我们的资源文件。目前是一个xaml的资源字典。需要我们新建出来。

代码如下:


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:ResourceLibrary">
    <SolidColorBrush x:Key="ReusableTitle" Color="Yellow"/>
</ResourceDictionary>

而后是引用的App,在App.xaml下添加跨程序集的资源字典(使用pack: URI): 


<Application x:Class="WPFUsingResourceLib.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPFUsingResourceLib"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/ResourceLibrary;component/ReusableDictionary.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

在Window窗体中使用以添加引用的资源:


<Window x:Class="WPFUsingResourceLib.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPFUsingResourceLib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid> 
        <Button  VerticalAlignment="Top" HorizontalAlignment="Left" Width="180" Height="30" Content="我是跨程序集使用资源" Background="{StaticResource  ReusableTitle}"/>         
    </Grid>
</Window>

效果图如下:

好啦,这一篇就写这么多把。主要是就是对象资源的使用,静态和动态资源的差别,跨程序集资源,元素可以使用父类资源。这篇主要是理解就行,后面会写软件,用于演示如何更好的使用这些内容。

以上就是详解WPF中的对象资源的详细内容,更多关于WPF 对象资源的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解WPF中的对象资源

本文链接: https://lsjlt.com/news/123181.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解WPF中的对象资源
    目录资源定义好之后,再使用时,可以指定以静态的方式使用资源,还是以动态的方式使用资源。资源我们都会使用了,接下来需要归类整理我们的资源,使用资源字典:跨程序集使用资源:这个对象资源跨...
    99+
    2024-04-02
  • 详解pygame中Rect对象
    目录class pygame.Rect Rect对象的属性:方法剪切图片的应用class pygame.Rect Rect 对象的属性: Rect 表示的区域必须位于一个 Surfa...
    99+
    2024-04-02
  • VBS中FileSystemObject对象详解
    FileSystemObject对象是Visual Basic Scripting Edition(VBS)中的一个内置对象,用于访...
    99+
    2023-08-11
    VBS
  • wpf怎么绑定对象的属性
    在WPF中,可以使用数据绑定来绑定对象的属性。 首先,确保你的对象实现了INotifyPropertyChanged接口。这个接口定...
    99+
    2023-10-24
    wpf
  • Python中的类对象示例详解
    抽象特点 Python 一切皆对象,基于此概念,对 类 class 有以下特点: 类与实例的属性 类对象创建可选择定义类属性,创建实例对象时,实例属性自动执行类的__init__方...
    99+
    2024-04-02
  • 详解JS中的对象字面量
    目录前言1. 在对象构造上设置原型1.1 __proto__用法的特殊情况2.简写方法定义3. super 的使用3.1 super 使用限制4.计算属性名4.1 symbol 作为...
    99+
    2024-04-02
  • 详解Pandas中GroupBy对象的使用
    目录使用 Groupby 三个步骤将原始对象拆分为组按组应用函数AggregationTransformationFiltration整合结果总结今天,我们将探讨如何在 Python...
    99+
    2024-04-02
  • Node.jsProcess对象详解
    目录Node中的Process 对象环境变量方法和事件Node中的Process 对象 Process是一个全局对象,即 global 对象的属性,无须声明即可访问。它用于描述当前 ...
    99+
    2022-11-13
    Node.js Process对象 Node.js Process
  • c# wpf如何更好的使用Application程序集资源
    目录1)在程序集中添加资源2)在程序集中查找资源  这一篇单独拿出来分析这个程序集资源,为的就是不想让大家把程序集资源和exe程序强关联,因为程序集资源实际上是二进制资源,后续编译过...
    99+
    2024-04-02
  • Android 往Framework中添加新资源的方法详解
    有时候我们想在标准的Framework中添加自己的新的资源怎么办呢?办法就是我们来尝试下。通过Eclipse的联系,我们可以联想到是否就是简单的把字符串放在res的各个文件夹里...
    99+
    2022-06-06
    方法 framework Android
  • 一文详解kubernetes 中资源分配的那些事
    目录概要一个nginx的配置我们进入nginx容器所在目录看下cpu.sharescpu.cpu.cfs_period_us、cpu.cfs_quota_us资源使用率数据来源下ku...
    99+
    2023-05-17
    kubernetes 资源分配 kubernetes 资源
  • flutter中的资源和图片加载示例详解
    目录封面图指定相应的资源资源绑定 Asset bundling资源变体加载资源加载文本资源加载图片加载依赖包中的图片最后封面图 下个季度的目标是把前端监控相关的内容梳理出来,梳理出...
    99+
    2022-12-29
    flutter资源图片加载 flutter 资源图片
  • vue-cli中的图片资源存放位置详解
    目录vue-cli图片资源存放位置1. public文件夹 - 引用(以/开头)2. assets文件夹 - 引用(./或@/开头)vue-cli图片和第三方资源放的地方assets...
    99+
    2024-04-02
  • JavaScript的Proxy对象详解
    目录一、Proxy 是什么?二、怎么用?1、使用 Proxy 的简单实例2、目标对象被正确修改3、使用 set handler 做数据验证4、扩展构造函数总结一、Proxy 是什么?...
    99+
    2024-04-02
  • c# WPF中的TreeView使用详解
    目录前台后台在wpf中实现treeview的功能,可能看到很多分享的都是简单的绑定,仅此记录自己完成的功能。 前台 <TreeView x:Name="chapterTre...
    99+
    2024-04-02
  • 详解JavaScript中Arguments对象用途
    目录前言Arguments 的基本概念Arguments 的作用获取实参和形参的个数修改实参值改变实参的个数检测参数合法性函数的参数个数不确定时,用于访问调用函数的实参值遍历或访问实...
    99+
    2024-04-02
  • 详解Java面向对象中的继承
    继承的概念 继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类在继承父类的同时也可以添加自己的属性和方法,从而实现代码的...
    99+
    2023-05-19
    Java 面向对象 Java 继承
  • 详解Java中类与对象的关系
    目录前言一、类与对象的介绍二、类的实例化三.类与对象的使用方法3.1对象的初始化3.2内存显示图四.this的使用方法总结前言 已经开始类与对象的讲解了,正式步入了Java的道路了,...
    99+
    2023-05-19
    Java类 Java对象
  • python基础中的文件对象详解
    目录一、python读取和写入文件内容二、文件对象的写入三、实现文件内容的拷贝四、通过文件对象cmd.exe对命令行工具进行复制总结一、python读取和写入文件内容 任务:在cmd...
    99+
    2024-04-02
  • 深入源码解析Python中的对象与类型
    对象 对象, 在C语言是如何实现的? Python中对象分为两类: 定长(int等), 非定长(list/dict等) 所有对象都有一些相同的东西, 源码中定义为PyObject和PyVarObje...
    99+
    2022-06-04
    源码 对象 类型
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作