【WPF.NET开发】属性更改事件

本文内容

  1. 先决条件
  2. 标识属性更改事件
  3. 属性触发器

Windows Presentation Foundation (WPF) 定义几个为响应属性值的更改而引发的事件。 该属性通常是依赖项属性。 事件本身可以是路由事件,也可以是标准公共语言运行时 (CLR) 事件,具体取决于事件是应通过元素树路由,还是仅在属性发生更改的对象上发生。 当属性更改仅与属性值发生更改的对象相关时,后一种方案适用。

1、先决条件

本文假定你对依赖有基本的了解,并且已阅读
路由事件概述。

2、标识属性更改事件

并非所有报告属性更改的事件都通过签名或命名模式显式地标识为属性更改事件。 SDK 文档交叉引用事件和属性,并指示事件是否直接与属性值更改相关。

某些事件使用特定于属性更改事件的事件数据类型和委托。 例如,RoutedPropertyChanged 和 DependencyPropertyChanged 事件都有特定的签名。 以下几节中讨论了这些事件类型。

2.1 RoutedPropertyChanged 事件

RoutedPropertyChanged 事件具有 RoutedPropertyChangedEventArgs<T> 事件数据和 RoutedPropertyChangedEventHandler<T> 委托。 事件数据和委托都有泛型类型参数 T。 定义处理程序时,指定更改的属性的实际类型。 事件数据包含 OldValue 和 NewValue 属性,其运行时类型与更改的属性相同。

名称中的“Routed”部分表示属性更改事件注册为路由事件。 属性更改路由事件的优势在于,每当子元素属性发生更改时,父元素都会收到通知。 这意味着当控件的任何复合部件的值发生更改时,控件的顶层元素会接收属性更改事件。 例如,假设创建一个合并 RangeBase 控件的控件,例如 Slider。 如果 Value 属性的值在滑块部分发生更改,你可在父控件(而非该部分)上处理此更改。

避免使用属性更改事件处理程序来验证属性值,因为这不是大多数属性更改事件的设计意图。 通常,提供属性更改事件是为了你能够在代码的其他逻辑区域响应值更改。 在属性更改事件处理程序内再次更改属性值并不明智,并且可能导致意外的递归,具体取决于处理程序的实现方式。

如果属性是自定义依赖属性,或者处理的是定义了实例化代码的派生类,则 WPF 属性系统有更好的方式来跟踪属性更改。 这种方式是使用内置 CoerceValueCallback 和 PropertyChangedCallback 属性系统回调。

2.2 DependencyPropertyChanged 事件

DependencyPropertyChanged 事件具有 DependencyPropertyChangedEventArgs 事件数据和 DependencyPropertyChangedEventHandler 委托。 这些事件是标准 CLR 事件,而不是路由事件。 DependencyPropertyChangedEventArgs 不是通常的事件数据报告类型,因为它不派生自 EventArgs,而且它是一个结构,并非一个类。

DependencyPropertyChanged 事件的一个示例是 IsMouseCapturedChanged。 DependencyPropertyChanged 事件比 RoutedPropertyChanged 事件稍微常见一些。

与 RoutedPropertyChanged 事件数据类似,DependencyPropertyChanged 事件数据包含 OldValue 和 NewValue 属性。 出于前面提到的原因,请避免使用属性更改事件处理程序再次更改属性值。

3、属性触发器

与属性更改事件密切相关的一个概念是属性触发器。 属性触发器是在样式或模板内创建的。 通过属性触发器,可以创建基于分配了触发器的属性的值的条件行为。

属性触发器操作的属性必须是依赖属性。 它可以是(且通常是)只读依赖属性。 如果控件公开的依赖属性的名称以“Is”开头,则表明该属性至少部分设计为属性触发器。 采用此命名规则的属性通常是只读的 Boolean 依赖属性,其属性的主要作用是报告控件状态。 如果控件状态影响实时 UI,则该依赖属性是一个属性触发器候选项。

有些属性具有专用属性更改事件。 例如,IsMouseCaptured 具有 IsMouseCapturedChanged 属性更改事件。 IsMouseCaptured 属性是只读的,其值由输入系统修改。 输入系统在每次实时更改时都将引发 IsMouseCapturedChanged 事件。

属性触发器限制

与真正的属性更改事件相比,属性触发器具有一些限制。

属性触发器
通过完全匹配逻辑来工作,在该逻辑中指定将激活触发器的属性名称和特定值。 示例为 <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>。 属性触发器语法限制大多数属性触发器用于 Boolean 属性或采用专用枚举值的属性。 可能值的范围必须可管理,这样你才能为每种情况定义一个触发器。 有时,属性触发器仅针对特殊值存在,例如当项计数达到零时。 单个触发器不能设置为在属性值偏离特定值(如零)时激活。 请考虑实现代码事件处理程序,或实现在值不为零时从触发器状态切换回来的默认行为,而不是针对所有非零情况使用多个触发器。

属性触发器语法与编程中的“if”语句类似。 如果触发器条件为 true,将“运行”属性触发器的“主体”。 属性触发器的“主体”是标记,而不是代码。 该标记被限制为只能使用一个或多个 Setter 元素来设置应用了样式或模板的对象的其他属性。

当属性触发器的“if”条件具有各种可能值时,建议使用触发器外的 Setter 将此相同的属性值设置为默认值。 这样,当触发器条件为 true 时,触发器内的 setter 将优先,否则触发器外的 Setter 将优先。

对于一个或多个外观属性应基于同一元素的其他属性的状态而更改的情况,属性触发器非常有用。

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

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

相关文章

阿里高级Java面试真题

请解释Java中的反射机制及其潜在的性能影响。 Java中的反射机制是指在运行时检查或操作类、接口、字段、方法等程序结构的能力。通过反射&#xff0c;你可以在运行时获取类的信息、调用类的方法、访问或修改类的字段等&#xff0c;而不需要在编译时就确定这些操作。反射机制为…

MYSQL 深入探索系列六 SQL执行计划

概述 好久不见了&#xff0c;近期一直在忙项目的事&#xff0c;才有时间写博客&#xff0c;近期频繁出现sql问题&#xff0c;今天正好不忙咱们看看千万级别的表到底该如何优化sql。 案例 近期有个小伙伴生产环境收到了告警&#xff0c;有个6千万的日志表&#xff0c;查询耗时大…

“undefined reference to XXX“问题总结

"undefined reference to XXX"问题总结 引言 我们在Linux下用C/C工作的时候&#xff0c;经常会遇到"undefined reference to XXX"的问题&#xff0c;直白地说就是在链接(从.cpp源代码到可执行的ELF文件&#xff0c;要经过预处理->编译->链接三个阶…

1panel使用指南(一)面板安装

一、1panel简介 1Panel是杭州飞致云信息科技有限公司推出的产品 [1]&#xff0c;帮助用户实现快速建站。 [2]是一款现代化、开源的Linux服务器运维管理面板&#xff0c;于2023年3月推出&#xff0c;深度集成WordPress和Halo&#xff0c;一键完成域名绑定、SSL证书配置等操作&a…

draw.io学习笔记

1、链接 1.1、自动连接图形 鼠标放在图形上&#xff0c;点击出现的箭头&#xff0c;会自动出常用图形 1.2、固定连接 如果拖动其中一个图形的话&#xff0c;固定链接的形状会是曲线连过去。 方法&#xff1a;不要点击左边图形鼠标放在边框上面左边出现绿圆点鼠标左键点击图形的…

小秋SLAM入门实战ROS文章汇总

小秋SLAM入门实战教程汇总 【launch文件中如何启动gdb调试单个节点多个节点】 一个ros可执行程序可以定义几个节点&#xff1f; ros启动节点的launch文件你真的会写吗&#xff1f; 【Point Cloud ROS】用一张彩色图像和深度图像生成点云图像 【Point Cloud ROS】两张点云图像之…

Oracle研学-对象

学自B站黑马程序员 1.视图 (物化视图序列同义词oracle特有&#xff09; 1.对一个SQL语句的封装&#xff0c;一个虚拟的表。-简化开发 视图是一种数据库对象&#xff0c;是从一个或者多个数据表或视图中导出的虚表&#xff0c;视图所对应的数据并不真正地存储在视图中&#xff…

【Linux】深度解剖环境变量

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉并掌握Linux的环境变量。 > 毒鸡汤&#x…

LeetCode刷题--- 单词搜索

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述…

LLM之RAG实战(十一)| 使用Mistral-7B和Langchain搭建基于PDF文件的聊天机器人

在本文中&#xff0c;使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序&#xff0c;可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few-…

CENTOS docker拉取私服镜像

概述 docker的应用越来越多&#xff0c;安装部署越来越方便&#xff0c;批量自动化的镜像生成和发布都需要docker镜像的拉取。 centos6版本太老&#xff0c;docker的使用过程中问题较多&#xff0c;centos7相对简单容易。 本文档主要介绍centos系统安装docker和拉取docker私…

一文了解无线通信 - NB-IOT、LoRa

NB-IOT、LoRa 目录概述需求&#xff1a; 设计思路实现思路分析 NB-IOT1.LoRa2.区别 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,chall…

奇偶公式推导

推导前提: 基函数: f ( x ) − f ( − x ) f(x)-f(-x) f(x)−f(−x)偶函数: f ( x ) f ( − x ) f(x)f(-x) f(x)f(−x) 1. 奇函数 ∗ 奇函数 偶函数 奇函数*奇函数偶函数 奇函数∗奇函数偶函数 f 1 ( x ) ∗ f 2 ( x ) f_1(x)*f_2(x) f1​(x)∗f2​(x) − f 1 ( x ) ∗ …

[sparkSQL] Shuffle

在Spark SQL中&#xff0c;Shuffle 是指将数据重新分布到不同的节点上以进行处理的操作。在 Spark SQL 中&#xff0c;以下是一些可能触发 Shuffle 的操作或代码&#xff1a; group by 和 aggregations&#xff1a; 当使用 GROUP BY 或聚合函数&#xff08;如 SUM、AVG&#xf…

istio 虚拟服务 yaml 解释

虚拟服务 virtualservice 可以类比 k8s service 管理 pod&#xff0c; vs 是管理 svc 的 vs 对 svc 定义了流量规则&#xff0c;将满足条件的流量转发到对应的服务后端 配置定义 hosts&#xff1a;流量发送的目标 在 k8s 中&#xff0c;hosts 一般是 servic 的短域名&#x…

简单了解SQL堆叠注入与二次注入(基于sqllabs演示)

1、堆叠注入 使用分号 ; 成堆的执行sql语句 以sqllabs-less-38为例 ?id1 简单测试发现闭合点为单引号 ?id1 order by 3 ?id1 order by 4使用order by探测发现只有三列&#xff08;字段数&#xff09; 尝试简单的联合注入查询 ?id-1 union select 1,database(),user()-…

开放网络+私有云=?星融元的私有云承载网络解决方案实例

在全世界范围内的云服务市场上&#xff0c;开放网络一直是一个备受关注的话题。相比于传统供应商的网络设备&#xff0c;开放网络具备软硬件解耦、云原生、可选组件丰富等优势&#xff0c;对云服务商和超大型企业有足够的吸引力。 SONiC作为开源的网络操作系统&#xff0c;使得…

Debian12升级openssh-9.6p1

下载openssh-9.6p1 https://www.openssh.com/ftp.html tar xvf openssh-9.6p1.tar.gz安装编译器和依赖库 apt-get install gcc apt-get install zlib1g-dev apt-get install libssl-dev apt-get install make编译 ./configure make 安装 make install为了使现在版本生效卸…

uni-app uni-app内置组件

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

机器学习之主成分分析(Principal Component Analysis,PCA)案例解析附代码

概念 主成分分析(Principal Component Analysis,PCA)是一种常用的降维技术,用于减少数据集维度并保留数据集中的主要特征。它通过线性变换将高维数据投影到低维空间,同时尽量保留数据集中的信息。 PCA的目标是找到数据中最重要的方向,即方差最大的方向,这些方向被称为…