WPF——属性

news2025/1/14 1:10:43

一、属性

  • 类最初只有字段与函数,字段为一个变量,访问权限可以是private,protected,public。而将字段设为private,不方便外界对类数据的操作,但是将字段设为public又怕外界对数据进行非法操作,于是便为每个字段设计了set和get,在保证数据的合法性的同时支持外界对其进行操作。
  • 因为字段有了对应的访问接口,便升级成为了属性。注意类函数是静态的,只有一份,因此类实例增多时,类的字段变为属性的内存存储空间不会增加,即同个字段的{set;get;}使用的是同一份。
  • private int id;
    public int Id { set; get; }

二、依赖属性

1. 依赖属性的定义

  • 依赖属性就是一种可以自己没有值,并能通过使用Binding从数据源获得值(依赖在别人身上)的属性,而拥有依赖属性的对象被称为“依赖对象”。
  • 与传统的CLR属性相比,依赖属性的优点有:1.节省实例对内存的开销 2. 属性值可以通过Binding依赖在其他对象上。

2. 依赖属性对内存的使用

  • WPF允许依赖对象在被创建的时候并不包含用于存储数据的空间、只保留在需要用到数据时能够获得默认值、借用其他对象数据或实时分配空间的能力。
  • WPF中依赖对象的概念被DependdencyObject类实现,依赖属性的概念则由DependencyProperty类所实现。DependdencyObject通过GetValue和SetValue来获取和设置依赖属性的值。

3. 声明和使用依赖属性

public class Student:DependencyObject
{
	public static readonly DependencyProperty=
		DependencyProperty.Register("Name",typeof(string),typeof(Student));
}

声明:
1. 依赖属性一定要在依赖对象DependencyObject内声明
2. 成员变量名称后面需要加Property以标识其为依赖属性
3. 需要同时被public static readonly三个修饰符修饰
4. 并非使用new操作符得到而是使用DependencyProperty.Register方法生成

  • 依赖属性是由public static readonly修饰的DependencyProperty实例,没有包装器(set;get)这个依赖属性依旧存在

  • 包装器的作用是以“实例属性”的形式向外界暴露依赖属性,这样依赖属性才能成为Binding的Path

  • 注册依赖属性使用的第二个参数是一个数据类型,这个数据类型也是包装器的数据类型

  • 在没有对依赖属性使用包装器时,外界只能通过类实例的GetValue()和SetValue()来对依赖属性进行值的设置与获取。

  • 若为依赖属性添加一个CRL属性外包装,则外界可以直接访问依赖属性。

public class Student:DependencyObject
{
	public string Name
	{
		get{ return (string}GetValue(NameProperty);}
		set{ SetValue(NameProperty,value);}
	}
}

值得注意的是,Student类虽然没有实现InoticePropertyChanged接口,但是当属性的值发送改变时与之关联的Binding对象依然可以得到通知,依赖属性默认带有这样的功能,因此会是很好的Binding数据源。

4. 依赖属性值存储的秘密

为什么依赖属性被public static readonly修饰?

  • 系统维护一个全局静态的依赖属性实例哈希表。
  • 依赖对象实例的属性名和宿主类型名生成hash code为Key,依赖对象实例为Value,被存入哈希表中。
  • 每个依赖属性实例会有一个GlobalIndex属性,系统通过该值的唯一性可以在哈希表中找到对应的EffectiveValueEntry来获取值。
  • 每个依赖对象实例都会维护一个EffectValueEntry[],存储不同的依赖属性实例的GlobalIndex,为检索到实例对应属性的值而存在。
  • 总的来说,static关键字所修饰的依赖属性对象其作用是用来检索真正的属性而不是存储值,被用来检索值的实际上是依赖属性的GlobalIndex属性。

依赖属性的值除了可能存储在默认值和EffectiveValueEntry[]外,还有很多途径可以获得,但是它们有优先级控制。
在这里插入图片描述

三、附加属性

1. 附加属性的定义

  • 附加属性是指一个属性本来不属于某个对象,但由于某种需求而被后来附加上。即把对象放入一个特定环境后对象才具有的属性(表现出来就是被环境赋予的属性)就被称为附加属性。
  • 比如说,TextBox在Grid下具有Grid.Column、Grid.Row等属性,在Canvas在具有Canvas.Top、Canvas.Left等属性,在DockPanel下具有DockPanel.Dock属性。需要注意的是,附加属性的真实所有者不是TextBox,而是Grid、Canvas、DockPanel。

2. 附加属性的声明

附加属性的作用就是将属性与数据类型(宿主)解耦,让数据类型的设计更加灵活,其本质就是依赖属性,二者仅在注册和包装器上有一点区别。声明附加属性与依赖属性及其相似,唯一的不同就是注册附加属性使用的是名为RegisterAttached的方法,但参数却与使用Register方法无异。

class School:DependencyObject
{
	public static int GetGrade(DependencyObject obj)
	{
		return (int)obj.GetValue(GradeProperty);
	}
	public static void SetGrade(DependencyObject obj,int value)
	{
		obj.SetValue(GradeProperty,value);
	}
	public static readonly DependencyProperty GradeProperty=
		DependencyProperty.RegisterAttached("Grade",typeof(int),typepf(School),new UIPropertyMetaData(0));
}

3.附加属性的使用

如何消费附加属性呢?直接使用宿主的GetPropertyName和SetPropertyName将值赋值给某个类对象。值仍然被保存在Human实例的EffectiveValueEntry数组里,只是用于在数组里检索值的依赖属性(即附加属性)并不以Human类为宿主而是寄宿在School类里。

private void Button_Click(object sender,RoutedEventArgs e)
{
	Human human=new Human();
	School.SetGrade(human,6);
	int grade=School.GetGrade(human);
	MessageBox,Show(grade.ToStrin());
}

4. 附加属性的依赖绑定

  • 最后,因为附加属性其本质是依赖属性,所以它的值也可以使用Binding依赖在其他对象的数据上。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ChatBI】超轻量Python库Vanna快速上手,对接oneapi

oneapi 准备 首先确保你有oneapi ,然后申请 kimi的api 需要去Moonshot AI - 开放平台 然后添加一个api key 然后打开oneapi的渠道界面,添加kimi。 然后点击 测试, 如果能生成响应时间,就是配置正确。 然后创建令牌 http:…

探秘美食新宠:嘴尚绝卤味,口感惊艳你的味蕾!

在繁华的都市中,一道独特的卤味小吃悄然走红,它就是“嘴尚绝卤味”。今天,就让我们一起走进这家卤味店,探寻那令人回味无穷的口感秘密。 一、初识嘴尚绝卤味 “嘴尚绝”这个名字,一听就让人联想到美食的极致诱惑。店内…

从零开始构建CNN模型

猫狗分类问题——从零开始构建CNN 我们将使用相同的体系结构,并进行一些小的更改,如下所示。 第一个线性层的输入尺寸发生变化,因为猫和狗的图像尺寸是(256,256)。添加了另一个线性层来为模型学习提供更多的灵活性。 让我们来看看实现网络架…

卷积的通俗解释

以时间和空间两个维度分别理解卷积,先用文字来描述: 时间上,任何当前信号状态都是迄至当前所有信号状态的叠加;时间上,任何当前记忆状态都是迄至当前所有记忆状态的叠加;空间上,任何位置状态都…

如何将视频里的语音转成文字?5种方法轻松解决

这个信息爆炸的时代,视频内容如同潮水般涌来,而我们经常需要从这些海量的视频资源中提取关键信息。无论是为了学习、工作还是娱乐,将视频里的语音转换成文字都是一种高效的方法。这不仅可以帮助我们更好地理解内容,还能方便我们进…

【自然语言处理系列】Python 字符串操作技巧:清理、替换与合并

在编写Python程序时,字符串处理是一项常见的任务。了解如何有效地清理、修改和合并字符串对于数据预处理、文本分析和日常编程都至关重要。本文将引导您通过一系列实用的示例来掌握Python中字符串的核心操作,包括去除不需要的空格和特殊字符、替换文本中…

轻松搞定数据可视化配色,这份指南助你一臂之力!

配色是数据可视化图表的主要因素。一组合适的配色可以表达数据的重点和趋势,而不良的配色会削弱可视化表达的有效性。在本文中,我将梳理数据可视化中使用的配色板类型,通过案例揭示数据可视化配色技巧,并介绍可生成配色板的插件&a…

手撕RPC——前言

手撕RPC——前言 一、RPC是什么?二、为什么会出现RPC三、RPC的原理3.1 RPC是如何做到透明化远程服务调用?3.2 如何实现传输消息的编解码? 一、RPC是什么? RPC(Remote Procedure Call,远程过程调用&#xff…

Python笔记 文件的读取操作

1.open()打开函数 再Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下 open(name,mode,encoding) name:是要打开的文件名的字符串(可以包含文件所在的具体路径) mode&…

[FreeRTOS 基础知识] 信号量 概念

文章目录 信号量定义信号量特性 信号量定义 信号量是一个抽象的数据类型,通常包含一个整数值以及一个等待该值变为正数的任务列表(也称为等待队列)。信号量的整数值代表了系统中某种资源的可用数量。 在操作系统中信号量用于控制对共享资源访…

【Solr 学习笔记】Solr 源码启动教程

Solr 源码启动教程 本教程记录了如何通过 IDEA 启动并调试 Solr 源码,从 Solr9 开始 Solr 项目已由 ant 方式改成了 gradle 构建方式,本教程将以 Solr 9 为例进行演示,IDE 选择使用 IntelliJ IDEA。 Solr github 地址:https://gi…

技术干货|使用机器学习进行大数据信用评分实战演练

利用数据进行客户分类是当前金融信用风险、电商精准营销等的主流方法。那么,如何实现轻松实现客户分类呢?下面就为您介绍RapidMiner是如何快速实现客户分类的数据处理和可视化的。 例如,我们手上有某银行8000多名客户的贷款还款记录&#xff…

保姆级 | Windows 复古风格终端样式设置

0x00 前言 前段时间有朋友询问我 Windows 终端的样式是如何设置的,我也进行了一些简单的回复。在之前的 Windows 11 版本中,系统提供了一个界面按钮,可以直接将终端样式设置为复古风格。然而,系统更新之后,这个按钮好像…

对比A100和4090:两者的区别以及适用点

自2022年年末英伟达发布4090芯片以来,这款产品凭借着其优异的性能迅速在科技界占据了一席之地。现如今,不论是在游戏体验、内容创作能力方面还是模型精度提升方面,4090都是一个绕不过去的名字。而A100作为早些发布的产品,其优异的…

LLama 3的各种微调:拿我司七月的paper-review数据集微调LLama 3

前言 llama 3出来后,为了通过paper-review的数据集微调3,有以下各种方式 不用任何框架 工具 技术,直接微调原生的llama 3,毕竟也有8k长度了 效果不期望有多高,纯作为baseline通过PI,把llama 3的8K长度扩展…

标准立项 | 温室气体排放核算与报告要求 废油资源化企业

国内由于现有的废油再生企业规模较小,承担社会责任能力不强,在技术创新尤其是需要通过工程基础研究解决关键科技问题的创新积极性不高,由于经济成本的原因,多采用较落后的加工工艺,没有对废油中的特征污染物及毒害组分…

Vue和React总结

数据的更改更为简单,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作 (5)虚拟dom 不再使用原生的dom操作节点,极大解放dom操作,但具体操作的还是dom不过是换了另一种方式 (6)各种指令;过滤器 v-text主要用来更新textContent,可以等同于JS的text属性。 v-…

browerify介绍和简单实用,github的这个作者运用的太妙了

官方代码仓库:https://github.com/browserify/browserify 在github闲逛的时候,发现了一个很神奇的项目,这个项目的特点就是实用纯vue和js代码实现了直播间消息的获取,获取的方式就是建立websocket连接,然后接收消息&a…

Redis队列自研组件

背景 年初的时候设计实践过一个课题:SpringBootRedis实现不重复消费的队列,并用它开发了一个年夜饭下单和制作的服务。不知道大家还有没有印象。完成这个课题后,我兴致勃勃的把它运用到了项目里面,可谁曾想,运行不久后…

1992-2019年全球实际国内生产总值数据集

国内生产总值(GDP),可以有效评价居民的经济状况和生活水平,在各项研究中都非常常用!然而目前在全球不少国家中,对GDP统计存在着统计方法不当、蓄意操纵的行为,导致官方GDP统计数据难以真正反映出真实的经济发展水平。 …