【WPF.NET开发】附加事件

本文内容

  1. 先决条件
  2. 附加事件语法
  3. WPF 如何实现附加事件
  4. 附加事件方案
  5. 处理附加事件
  6. 定义自定义附加事件
  7. 引发 WPF 附加事件

Extensible Application Markup Language (XAML) 定义了一种语言组件和称为附加事件的事件类型。 附加事件可用于在非元素类中定义新的
路由事件,并在树中的任何元素上引发该事件。 为此,必须将附加事件注册为路由事件,并提供支持附加事件功能的特定
支持代码。 由于附加事件注册为路由事件,因此在元素上引发时,它们会通过元素树传播。

1、先决条件

本文假定你已基本了解 Windows Presentation Foundation (WPF) 路由事件,并已阅读路由事件概述
和WPF 中的 XAML。 若要理解本文中的示例,还应当熟悉 XAML 并知道如何编写 WPF 应用程序。

2、附加事件语法

在 XAML 语法中,附加事件由其事件名称及其所有者类型指定,格式为 <owner type>.<event name>。 因为事件名称是使用具有其所有者类型的名称限定的,所以语法允许将该事件附加到可以实例化的任何元素。 此语法也适用于附加到沿事件路由的任意元素的常规路由事件的处理程序。

以下 XAML 属性语法将 AquariumFilter.Clean 附加事件的 AquariumFilter_Clean 处理程序附加到 aquarium1 元素:

<aqua:Aquarium x:Name="aquarium1" Height="300" Width="400" aqua:AquariumFilter.Clean="AquariumFilter_Clean"/>

在此示例中,aqua: 前缀是必需的,因为 AquariumFilter 和 Aquarium 类存在于不同的公共语言运行时 (CLR) 命名空间和程序集中。

还可以在代码隐藏中附加已附加事件的处理程序。 为此,请在处理程序应附加到的对象上调用 AddHandler 方法,并将事件标识符和处理程序作为参数传递给此方法。

3、WPF 如何实现附加事件

WPF 附加事件作为由 RoutedEvent 字段支持的路由事件实现。 因此,附加事件在引发后会通过元素树传播。 通常,引发附加事件的对象(称为事件源)是系统或服务源。 系统或服务源不是元素树的直接部分。 对于其他附加事件,事件源可能是树中的元素,例如复合控件中的组件。

4、附加事件方案

在 WPF 中,附加事件用于具有服务级别抽象的某些功能区域。 例如,WPF 使用由静态 Mouse 或 Validation 类启用的附加事件。 与服务交互或使用服务的类可以使用附加事件语法与事件交互,或者将附加事件显示为路由事件。 后一个选项是类如何集成服务功能的一部分。

WPF 输入系统广泛使用附加事件。 但是,几乎所有附加事件都通过基本元素显示为等效的非附加路由事件。 每个路由输入事件都是基本元素类的一个成员,并使用 CLR 事件“包装器”提供支持。 你很少会直接使用或处理附加事件。 例如,与在 XAML 或代码隐藏中使用附加事件语法相比,通过等效 UIElement.MouseDown 路由事件处理 UIElement 上的基础附加 Mouse.MouseDown 事件更为容易。

附加事件通过启用输入设备的未来扩展来服务于体系结构目的。 例如,新的输入设备只需引发 Mouse.MouseDown 即可模拟鼠标输入,并且无需从 Mouse 派生即可执行此操作。 此方案会涉及事件的代码处理,而附加事件的 XAML 处理则与此方案无关。

5、处理附加事件

编码和处理附加事件的过程与非附加路由事件的基本相同。


前文所述,现有的 WPF 附加事件通常不是专门用于在 WPF 中进行直接处理。 通常,附加事件的用途是使复合控件中的元素能够向控件中的父元素报告其状态。 在这种情况下,事件在代码中引发,并依赖于相关父类中的类处理。 例如,Selector 中的项应引发 Selected 附加事件,该事件随后由 Selector 类进行类处理。 Selector 类可能将 Selected 事件转换为 SelectionChanged 路由事件。 

6、定义自定义附加事件

如果从常见的 WPF 基类派生,可以通过在类中包含两个访问器方法来实现自定义附加事件。 这些方法包括:

  • Add<事件名称>Handler 方法,其中第一个参数是附加事件处理程序的元素,第二个参数是要添加的事件处理程序。 方法必须是 public 和 static,没有返回值。 该方法调用 AddHandler 基类方法,将路由事件和处理程序作为参数传入。 此方法支持 XAML 属性语法,用于将事件处理程序附加到元素。 此方法还可实现对附加事件的事件处理程序存储的代码访问。

  • Remove<事件名称>Handler 方法,其中第一个参数是附加事件处理程序的元素,第二个参数是要移除的事件处理程序。 方法必须是 public 和 static,没有返回值。 该方法调用 RemoveHandler 基类方法,将路由事件和处理程序作为参数传入。 此方法允许代码访问附加事件的事件处理程序存储。

WPF 将附加事件作为路由事件实现,因为 RoutedEvent 的标识符是由 WPF 事件系统定义的。 另外,路由一个事件也是对附加事件的 XAML 语言级概念的自然扩展。 此实现策略将附加事件的处理限制为 UIElement 派生类或 ContentElement 派生类,因为只有这些类才具有 AddHandler 实现。

例如,以下代码定义了 AquariumFilter 所有者类(不是元素类)上的 Clean 附加事件。 代码将附加事件定义为路由事件,并实现所需的访问器方法。

public class AquariumFilter
{// Register a custom routed event using the bubble routing strategy.public static readonly RoutedEvent CleanEvent = EventManager.RegisterRoutedEvent("Clean", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AquariumFilter));// Provide an add handler accessor method for the Clean event.public static void AddCleanHandler(DependencyObject dependencyObject, RoutedEventHandler handler){if (dependencyObject is not UIElement uiElement)return;uiElement.AddHandler(CleanEvent, handler);}// Provide a remove handler accessor method for the Clean event.public static void RemoveCleanHandler(DependencyObject dependencyObject, RoutedEventHandler handler){if (dependencyObject is not UIElement uiElement)return;uiElement.RemoveHandler(CleanEvent, handler);}
}

返回附加事件标识符的 RegisterRoutedEvent 方法与用于注册非附加路由事件的方法相同。 附加和非附加路由事件均已注册到集中式内部存储。 此事件存储实现启用了
路由事件概述中介绍的“事件即界面”概念。

与用于支持非附加路由事件的 CLR 事件“包装器”不同,附加事件访问器方法可以在并非派生自 UIElement 或 ContentElement 的类中实现。 这很可能是因为附加事件支持代码调用被传递到 UIElement 实例上的 UIElement.AddHandler 和 UIElement.RemoveHandler 方法。 相比之下,非附加路由事件的 CLR 包装器直接在所属类上调用这些方法,因此该类必须派生自 UIElement

7、引发 WPF 附加事件

引发附加事件的过程实质上与引发非附加路由事件的过程相同。

通常,代码不需要引发任何现有的 WPF 定义的附加事件,因为这些事件遵循常规的“服务”概念模型。 在该模型中,服务类(如 InputManager)负责引发 WPF 定义的附加事件。

当使用 WPF 基于路由事件
的附加事件的 WPF 模型定义自定义附加事件时,使用 UIElement.RaiseEvent 方法即可在任何 UIElement 或 ContentElement 上引发附加事件。 引发路由事件时,无论它是否附加,都需要将元素树中的元素指定为事件源。 然后,该源将报告为 RaiseEvent 调用方。 例如,要在 aquarium1 上引发 AquariumFilter.Clean 附加路由事件:

aquarium1.RaiseEvent(new RoutedEventArgs(AquariumFilter.CleanEvent));

在上述示例中,aquarium1 是事件源。

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

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

相关文章

Hadoop安装笔记2单机/伪分布式配置_Hadoop3.1.3——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

紧接着上一篇博客&#xff1a;Hadoop安装笔记1&#xff1a; Hadoop安装笔记1单机/伪分布式配置_Hadoop3.1.3——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2&#xff1a;离线数据处理-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/135…

SSL VPN移动安全接入策略

一、登陆策略 1、需求背景&#xff08;【系统设置】-【系统选项】&#xff09; 需求&#xff1a; &#xff08;1&#xff09;接入端口可以自定义且支持HTTP 端口跳转到HTTPS端口 &#xff08;2&#xff09;登录页面自持自定义背景、logo等 &#xff08;3&#xff09;登…

Permission Denied原因及解决方法

Permission Denied原因及解决方法 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨一个常见而又令人头疼的问题——“Permission denied解…

linux cat命令增加-f显示文件名功能

在使用cat命令配合grep批量搜索文件内容时&#xff0c;我仅仅能知道是否搜索到&#xff0c;不知道是在哪个文件里找到的。比如cat ./src/*.c | grep full_write,在src目录下的所有.c文件里找full_write,能匹配到所有的full_write&#xff0c;但是不知道它们分别在哪些文件里。于…

CData ADO.NET Data Providers 2022 Crack

ADO.NET 数据提供程序 轻松将 .NET 应用程序与 SaaS、NoSQL 和大数据连接起来 数据绑定到应用程序、数据库和服务 完整的创建、读取、更新和删除 (CRUD) 支持&#xff0c;无需编码 200 基于标准的 ADO.NET 数据提供程序 100% 适用于 .NET Standard、.NET Core 和 Xamarin 的完全…

1550 自由落体

#include<bits/stdc.h> using namespace std; int main(){double a,b,c,d,e,t1,t2,s1,s2;int n,num0;//定义cin>>a>>b>>c>>d>>e>>n;//输入t1sqrt(((a-e)*2.0)/10.0);t2sqrt((a*2.0)/10.0);s1bd-t1*c0.0001;s2b-t2*c-0.0001;//小球位…

作为铭文跨链赛道龙头,SoBit 有何突出之处?

跨链桥赛道将是铭文市场长期的发展的刚需 在比特币网络中&#xff0c;Ordinals 铭文铸造的铭文总量已经超过了 5100 万枚&#xff0c;并累计费用收入超 5028 BTC。同时&#xff0c;仅 BRC-20 叙事方向的市值&#xff0c;就已经超过了 30 亿美元&#xff0c;并且随着铭文资产种类…

简单工厂设计模式(计算器实例优化)

简单工厂设计模式&#xff08;计算器实例优化&#xff09; 介绍为什么采用面向对象编程而不是面向过程呢&#xff1f;实例讲解业务层划分出来逻辑层继承简单工厂&#xff1a;&#xff08;多态&#xff09;业务层&#xff1a;&#xff08;解耦合&#xff09;主控制台 总结 介绍 …

C语言实现关键字匹配算法(复制即用)

文章目录 前言功能要求运行截图全部代码 前言 无套路&#xff0c;均已上机通过&#xff0c;求个关注求个赞&#xff0c;提供答疑解惑服务。 功能要求 一份C源代码存储在一个文本文件中&#xff0c;请统计该文件中关键字出现的频度&#xff0c;并按此频度对关键字进行排序。要…

Centos如何修改ssh端口

想必很大一部分的同学用的是centos服务器&#xff0c;对于默认的22端口存在一定的安全风险&#xff0c;所以今天我们一起看下如何修改ssh端口 一、什么是SSH SSH&#xff08;Secure Shell&#xff09;是一种安全的远程登录协议&#xff0c;它允许您通过网络远程连接到Linux系统…

低成本高效率易部署,Ruff工业数采网关+IoT云平台赋能工厂数字化管理

随着工业4.0的快速发展&#xff0c;工业物联网是工业企业实现数字化转型的重要助力&#xff0c;物联网技术的应用也越来越广泛。 作为连接设备与网络的关键节点&#xff0c;数据采集网关是连接工业设备与物联网平台的硬件设备&#xff0c;它负责将工业设备的数据采集、传输到物…

Oracle(4)

子查询 子查询语法很简单&#xff0c;就是select 语句的嵌套使用。 查询工资比SCOTT高的员工信息 分析&#xff1a;两步即可完成 1. 查出SCOTT的工资 SQL> select ename, sal from emp where enameSCOTT 其工资3000 2. 查询比3000高的员工 SQL> select * from emp…

YHZ005 Window 下安装 IDLE 、IPython 以及PyCharm 等开发工具

目录 &#x1f998; Window 下&#x1f408; IDLE&#x1f9a2; IPython&#x1f432; PyCharm 资源编号&#xff1a;YHZ005 配套视频&#xff1a;https://www.bilibili.com/video/BV1zy4y1Z7nk?p6 &#x1f998; Window 下 &#x1f408; IDLE 具体请见视频操作&#xff1a;…

深入理解 YOLOv8:解析.yaml 配置文件目标检测、实例分割、图像分类、姿态检测

目录 yolov8导航 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 引言 YOLOv8配置文件概览 yolov8.yaml 1. nc 2. scales 3. backbone 4. head yolov8-seg.yaml 1. 参数部分 2. 骨架&#xff08;Backbone&#xff09;部分 3. 头部&#xff08;Head&…

《MySQL》事务篇

事务特性 ACID Atomicity原子性&#xff1a;事务中的操作要么全部完成&#xff0c;要么全部失败。 Consistency一致性&#xff1a;事务操作前后&#xff0c;数据满足完整性约束。 Isolation隔离性&#xff1a;允许并发执行事务&#xff0c;每个事务都有自己的数据空间&…

项目 引入 uView

安装 npm install uview-ui //或 yarn add uview-ui main.js引入 import Vue from vue; import uView from uview-ui;Vue.use(uView);//或// main.js import uView from /node_modules/uview-ui Vue.use(uView) uni.scss引入 import /node_modules/uview-ui/theme.scss…

2024年PMP考试新考纲-PMBOK第七版-【裁剪】真题解析

距离2024年3月份PMP考试的脚步越来越近了&#xff0c;如何快速、有效的备考3月份PMP考试呢&#xff1f;华研荟结合多年的PMP培训和辅导经验&#xff0c;前面的文章为大家提出了三个建议&#xff0c;只要按照这三个步骤走&#xff0c;现在从零开始也是完全有可能3A取得PMP证书的…

数据库是否可以直接作为数据仓库的数据源

在数据仓库使用数据时&#xff0c;我们是否可以直接将数据库作为数据源&#xff1f;如果使用了&#xff0c;会存在哪些问题&#xff1f; 数据库中存储的是业务数据&#xff0c;存储方式是行式存储&#xff1b;而数据仓库中数据是以列式存储的&#xff1b;如果数据仓库要想使用…

Android画布Canvas矩阵Matrix放大裁剪Rect区域的Bitmap,Kotlin

Android画布Canvas矩阵Matrix放大裁剪Rect区域的Bitmap&#xff0c;Kotlin private fun mydraw() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.h…

AI大模型

目录 前言 AGI通用人工智能 总结 前言 AI零基础直播公开课&#xff0c;了解一下。 AGI通用人工智能 query chatmind.tech 找一下这篇论文&#xff0c;了解一下 E为编码器&#xff0c;D为解码器 所谓大模型也就是编码器-解码器。 模型里会有一些公式和参数&#xff0c;厉害的…