WPF——属性

一、属性

  • 类最初只有字段与函数,字段为一个变量,访问权限可以是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.mzph.cn/web/33342.shtml

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

相关文章

尴尬时刻:如何在忘记名字时巧妙应对

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

llama系列模型学习

一、目录 llama1 模型与transformer decoder的区别llama2 模型架构llama2 相比llama1 不同之处llama3 相比llama2 不同之处llama、llama2、llama3 分词器词表大小以及优缺点采用的损失函数是什么?为什么Layer Norm 改为RMS Norm?如何消除模型幻觉? 二…

Vscode配置Verilog开发环境(二)

两年前我写过一篇vscode配置fpga开发环境的博客,近期发现查看的人数还是比较多的,经过两年的使用,优化了代码模板以及删减了一些插件等等,因此有了本文。 目前我的vscode只有下图中的九个插件,相比前文已经减少了一些了…

地级市绿色创新及碳排放与环境规划数据(2000-2021年)

数据简介:分享各个城市对于碳排放的降低做出了哪些共享。该数据是地级市2000-2021年间由绿色创新、碳排放与环境规制数据构成的能源与环境研究数据大合集,并对其进行可视化处理,供大家研究使用。当今我国大力推进生态文明建设、美丽中国建设等…

【日常开发之Windows共享文件】Java实现Windows共享文件上传下载

文章目录 Windows 配置代码部分Maven代码 Windows 配置 首先开启服务,打开控制面板点击程序 点击启用或关闭Windows功能 SMB1.0选中红框内的 我这边是专门创建了一个用户 创建一个文件夹然后点击属性界面,点击共享 下拉框选择你选择的用户点击添加…

python爬虫必须要高匿IP吗 ?

各个平台搜索关键词就可以找到不同品牌的代理IP了。 找倒是不难,难的是能从中挑选出靠谱且合适的代理品牌。 在选择代理IP这块,不建议使用免费和超低价的代理,因为这一类的代理往往非常不稳定,很多都被网站拉黑过,特…

PS添加物体阴影

一、选择背景,确保物体和北京分割出图层 二、右键单击物体图层,点击混合选项,点击投影 三、调整参数,可以看效果决定(距离是高度,扩展是浓度,大小是模糊程度),保存即可

实用软件下载:CrossOver 2024最新安装包及详细安装教程

​根据软件大数据显示上传或者手动输入软件都非常简单,一般来说CrossOver会自动连接到一个Win文件共享服务器(Samba或CIFS)上,使用者能够直接在这个服务器中选择并上传软件执行文件。实际上我们可以这样讲调整CrossOver设置&#…

汽车数据应用构想(五)

如果说路面信息(POI)可以通过采集车、人工等方式来获取,用户习惯可以通过手机生态应用来获取,那么车的信息应该算是车辆独有的垂直领域价值了,它是实实在在只有车厂才拥有的数据财富,任何互联网大厂都抢不走…

如何使用mapXplore将SQLMap数据转储到关系型数据库中

关于mapXplore mapXplore是一款功能强大的SQLMap数据转储与管理工具,该工具基于模块化的理念开发,可以帮助广大研究人员将SQLMap数据提取出来,并转储到类似PostgreSQL或SQLite等关系型数据库中。 功能介绍 当前版本的mapXplore支持下列功能…

一条Redis命令是如何执行的?

一条Redis命令是如何执行的? 源码结构核心数据结构redisServerredisClientredisDbredisObjectaeEventLoop 核心流程redis启动流程main() 主循环aeEventProcess执行过程命令执行的流程过程1(redis启动)过程2(客户端与服务端建立链接…

【Android】Android Studio 使用Kotlin写代码时代码提示残缺问题解决

问题描述 Android Studio升级之后,从Android Studio 4.2升级到Android Studio Arctic Fox版本,因为项目比较老,使用的Gradle 版本是3.1.3,这个版本的Android Studio最低支持Gradle 3.1版本,应该算是比较合适的版本。 …

不翻墙安装yolov8环境下的RT-DETR并实现PCB表面缺陷检测

目录 一、新建conda环境二、安装yolov8环境1.克隆安装包2.安装依赖包3.测试模型 任务2:基于RT-DETR实现PKU-PCB表面缺陷检测数据准备 数据增强测试 总结 一、新建conda环境 创建并激活conda环境: 在conda创建一个名为yolov8的新环境,并在其中…

国际网络专线的开通流程

1. 选择服务商:首先,您需要选择一个可靠的服务商来提供国际网络专线服务。确保服务商具有良好的声誉和专业知识,以便为您提供高质量的网络连接和支持。 2. 评估需求:在与服务商沟通之前,您需要明确自己的网络需求。这…

dp经典问题:LCS问题

dp:LCS问题 最长公共子序列(Longest Common Subsequence, LCS)问题 是寻找两个字符串中最长的子序列,使得这个子序列在两个字符串中出现的相对顺序保持一致,但不要求连续。 力扣原题链接 1.定义 给定两个字符串 S1…

猫狗识别—视频识别

猫狗识别—视频识别 1. 导入所需的库:2. 创建Tkinter主窗口并设置标题:3. 设置窗口的宽度和高度:4. 创建一个Canvas,它将用于显示视频帧:5. 初始化一个视频流变量cap,用于存储OpenCV的视频捕获对象&#xf…

【速速收藏】适用于Linux系统的五个优秀PDF编辑器

PDF (Portable Document Format) 是便携文档格式的缩写,这是一种用于电子共享文档的标准格式,广泛应用于各种文档类型的存储和分发。然而,有时我们可能需要对PDF文档进行更改和编辑。本文将介绍五款在Linux平台上广受欢迎的PDF编辑器。 ​​…

陀螺仪LSM6DSV16X与AI集成(8)----MotionFX库解析空间坐标

陀螺仪LSM6DSV16X与AI集成.8--MotionFX库解析空间坐标 概述视频教学样品申请源码下载开启CRC串口设置开启X-CUBE-MEMS1设置加速度和角速度量程速率选择设置FIFO速率设置FIFO时间戳批处理速率配置过滤链初始化定义MotionFX文件卡尔曼滤波算法主程序执行流程lsm6dsv16x_motion_fx…

【分布式事务】Seata AT实战

目录 Seata 介绍 Seata 术语 Seata AT 模式 介绍 实战(nacos注册中心,db存储) 部署 Seata 实现 RM 实现 TM 可能遇到的问题 1. Seata 部署成功,服务启动成功,全局事务不生效 2. 服务启动报错 can not get …

[java]集合类stream的相关操作

1.对list中的map进行分组 下面例子中&#xff0c;根据高度height属性进行分组 List<Map<String, Float>>originalList new ArrayList<>();originalList.add(new HashMap<String,Float>() {{put("lng", 180.0f);put("lat",90f);…