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.rhkb.cn/news/359657.html

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

相关文章

SpringMVC系列十一: 文件上传与自定义拦截器

文章目录 SpringMVC文件上传基本介绍需求分析 / 图解应用实例-代码实现 自定义拦截器什么是拦截器自定义拦截器执行流程分析图自定义拦截器应用实例快速入门注意事项和细节Debug执行流程 多个拦截器多个拦截器执行流程示意图应用实例1代码实现注意事项和细节 应用实例2 作业布置…

怎么区分Boombap 制作Boombap曲子教学 boombap音乐出现的时间

Boombap音乐作为嘻哈音乐文化的重要组成部分,具有独特的音乐节奏、样式和情感。要理解和区分Boombap音乐,需要从其音乐的历史渊源、音乐特征和文化影响入手。接下来给大家介绍怎么区分Boombap,制作Boombap曲子教学的具体内容。 一、怎么区分B…

虚拟机配置桥接模式

背景 因为要打一些awd比赛,一些扫描工具什么的,要用到kali,就想着换成一个桥接模式 但是我看网上的一些文章任然没弄好,遇到了一些问题 前置小问题 每次点开虚拟网络编辑器的时候都没有vmnet0,但是点击更改的时候却有vmnet0 第一步: 点击更改设置 第二步: 把wmnet0删掉 …

【计算机视觉】人脸算法之图像处理基础知识(六)

图像直方图 图像直方图是描述图像中像素强度分布的一种统计图表,它是图像处理和计算机视觉领域中一个非常基础且重要的概念。图像直方图通常用于分析图像的亮度、对比度特性,以及在图像增强、阈值分割、特征提取等多种图像处理任务。 import cv2 impor…

高通安卓12-固件升级

下载步骤 第一步 格式化 「下载一次即可;能开机能下载的板子 忽略这一步,直接执行第二步即可」 QFIL工具配置为UFS类型,勾选Provision,如下图: Programmer选择prog_firehose_ddr.elf,Provision Xml选择prov…

ONLYOFFICE8.1版本桌面编辑器测评

https://www.onlyoffice.com/zh/ 随着工作方式的不断演变,文档编辑软件成为了我们日常工作中不可或缺的一部分。而ONLYOFFICE作为一款开源且功能丰富的办公套件,其最新推出的8.1版本在原有基础上进行了大量的优化与更新,旨在提供更流畅、更安…

无人机巡检小羊仿真

详细视频地址 仿真效果 可视化三维仿真 gazebo物理仿真 px4 飞控仿真 仿qgc简易地面站 详细视频地址

微信小程序之横向列表展示

效果图 参考微信小程序可看 代码&#xff1a; <view class"lbtClass"><view class"swiper-container"><scroll-view class"swiper" scroll-x"true" :scroll-left"scrollLeft"><block v-for"(six…

DDK电通拧紧MFC-S060控制器过流维修

一、DDK伺服拧紧轴控制器过流故障的成因 1. 电源电压过低&#xff1a;当电源电压过低时&#xff0c;控制器可能会出现过流现象。 2. 负载过大&#xff1a;当负载过大时&#xff0c;DDK电通拧紧机控制器MFC-S060的电流也会随之增大&#xff0c;可能导致过流故障。 3. 控制器内部…

低价可转债崩盘,发生了什么?

下跌不在于“出库”&#xff0c;甚至不在于“风险”。问题更多在于交易层面&#xff0c;何时能积聚更多的左侧资金并成功过渡至右侧。 低价券怎么了&#xff1f; 如果说6月初主要是小微盘品种的退市风险&#xff0c;后来是一些评级下调的品种&#xff0c;到本周&#xff0c;已…

精益思想在机器人开发中的应用体现

精益思想源于制造业&#xff0c;旨在通过消除浪费、优化流程、持续改进来提升企业竞争力。在机器人开发中&#xff0c;精益思想同样具有指导意义。它要求开发团队在需求分析、设计、制造、测试等各个环节中&#xff0c;不断追求精益求精&#xff0c;力求在降低成本的同时提升产…

仓颉编程语言入门

华为在 2024 年 6 月 21 日的华为开发者大会上&#xff0c;华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言&#xff0c;并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。 仓颉编程语言文件后缀名为 .cj, 以下是第一个入门代码输出&#xff1a;你好&#xff0c;仓颉…

buuctf----firmware

- -一定不能再ubutu22进行,我是在18(血泪教训) binwalk安装 buuctf firmware(binwalk和firmware-mod-kit的使用)_buu firmware-CSDN博客 参考博客 指令 sudo apt-get update sudo apt-get install python3-dev python3-setuptools python3-pip zlib1g-dev libmagic-dev pi…

前端中的深拷贝

第1部分&#xff1a;引言 深拷贝&#xff1a;前端开发的隐形守护者 在前端开发的世界里&#xff0c;数据的传递和状态的管理是构建用户界面的基础。然而&#xff0c;数据的复制常常被忽视&#xff0c;直到它引发bug&#xff0c;我们才意识到它的重要性。深拷贝&#xff0c;这…

Springboot 共享电动单车管理系统-计算机毕业设计源码08401

目 录 摘要 1 绪论 1.1背景及意义 1.2国内外研究概况 1.3研究方法 1.4论文结构与章节安排 2 共享电动单车管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分…

React Suspense的原理

React Suspense组件的作用是当组件未完成加载时&#xff0c;显示 fallback 组件。那么 Suspense 是如何实现的呢&#xff1f;React 的渲染是通过 Fiber 进行的&#xff0c;Suspense 的更新机制也是要围绕 Fiber 架构进行的。Suspense 是由两部分组成&#xff0c;实际 UI 子组件…

自学指南:必备书籍清单--近100本R语言及生物信息相关书籍

R语言是一种功能丰富的编程语言&#xff0c;数据处理、统计分析是大家所熟知的基本功能。开源免费、活跃的全球社区、灵活可扩展等优点促使R语言飞速发展。目前&#xff0c;CRAN 软件包存储库包含 20446 个可用软件包&#xff0c;涵盖了从生物信息到金融分析等广泛的应用领域。…

spring-boot-devtools热部署功能集成使用

0.参考其他文章 Spring Boot之Spring-devtools热部署&#xff1a;实现快速开发与调试-阿里云开发者社区关于IDEA2022开启热部署没有compiler.automake.allow.when.app.running的解决方案-CSDN博客 1. Spring DevTools简介 Spring DevTools是Spring团队开发的一个模块&#xf…

理解人体手臂七个自由度对应的运动

写本篇的目的在于&#xff0c;我发现很多人理不清人体手臂运动时内收/外展、屈曲/伸展等动作描述的关系&#xff0c;包括我自己也是&#xff01; 我每次要用到的时候都要去查&#xff0c;记不下来&#xff0c;比较麻烦&#xff0c;于是归纳本篇&#xff0c;包含了我本人的理解 …

解析PDF文件中的图片为文本

解析PDF文件中的图片为文本 1 介绍 解析PDF文件中的图片&#xff0c;由两种思路&#xff0c;一种是自己读取PDF文件中的图片&#xff0c;然后用OCR解析&#xff0c;例如&#xff1a;使用PyMuPDF读取pdf文件&#xff0c;再用PaddleOCR或者Tesseract-OCR识别文字。另一种使用第…