笔记:在WPF中如何注册控件级全局事件和应用程序级全局事件

server/2024/10/16 0:25:47/

一、目的:在WPF中如何注册控件级全局事件和应用程序级全局事件


二、实现

应用程序级全局事件

//注册应用程序级全局事件
EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(ic_event_Click));

如上代码既会注册全局Button的Click事件,在任意位置点击Button既会触发注册的事件,但这种方式作用范围过大,对于有些业务来说这种方式会照成资源和性能上的浪费,本文将主要介绍空间级别的全局事件,这对于某功能来说既可以实现特殊的业务,也可以有效的控制性能。

控件级全局事件

比如有一个ItemsControl控件,绑定了一个集合,集合里面有很多Button操作的按钮,我们想要注册这些按钮的Click操作,这时需要用到控件级别的全局Button的Click事件。代码如下:

            <ItemsControl ItemsSource="{h:GetStudents}"><ItemsControl.ItemTemplate><DataTemplate><Button Content="{Binding Name}"/></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>

 主要实现方式有两种:

1> 在Xaml中实现
            <ItemsControl x:Name="ic_event" ButtonBase.Click="ItemsControl_Button_Click" ItemsSource="{h:GetStudents}"><ItemsControl.ItemTemplate><DataTemplate><Button Content="{Binding Name}"/></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>
        private void ItemsControl_Button_Click(object sender, RoutedEventArgs e){if (e.OriginalSource is Button button)MessageBox.Show(button.Content?.ToString());}

 可以看到直接在ItemsControl上注册Button.Click事件即可实现该效果,此时当点击控件中任意Button时会触发该事件

2>在代码中实现
//在代码中注册控件级全局事件
this.ic_event.AddHandler(Button.ClickEvent, new RoutedEventHandler(ItemsControl_Button_Click));

在代码中实现也比较简单,只需应用AddHandler方法注册一个Button.ClickEvent即可实现

总结

1、通过这种方式可以解决部分特殊业务,如上述示例中,可以注册控件内所有按钮点击事件而不需要对每个按钮单独做处理;

2、不仅仅局限Button.Click事件,任何路由事件和附加事件均可通过上述方式实现;

3、可以实现没有暴露出来的鼠标,键盘,触摸板等应用附加事件定义的功能进行注册,如:

            <ItemsControl x:Name="ic_event" Mouse.GotMouseCapture="ic_event_GotMouseCapture" ItemsSource="{h:GetStudents}"><ItemsControl.ItemTemplate><DataTemplate><Button Content="{Binding Name}"/></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>

 ItmsControl没有暴露GotMouseCapture事件,可以通过Mouse.GotMouseCapture去注册该事件

三、效果

需要了解的知识点 

EventManager Class (System.Windows) | Microsoft Learn

EventManager.RegisterClassHandler 方法 (System.Windows) | Microsoft Learn

ButtonBase.Click 事件 (System.Windows.Controls.Primitives) | Microsoft Learn

UIElement.AddHandler 方法 (System.Windows) | Microsoft Learn

UIElement.RemoveHandler(RoutedEvent, Delegate) Method (System.Windows) | Microsoft Learn

Mouse 类 (System.Windows.Input) | Microsoft Learn

Keyboard 类 (System.Windows.Input) | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

控件库 - WPF .NET Framework | Microsoft Learn

WPF 介绍 | Microsoft Learn

XAML概述 - WPF .NET | Microsoft Learn

Windows Presentation Foundation 简介 - WPF .NET | Microsoft Learn

使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn

源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

了解更多

适用于 .NET 8 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

适用于 .NET 7 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

欢迎使用 Expression Blend | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频


http://www.ppmy.cn/server/100949.html

相关文章

解引用QTreeWidget类型的迭代器指针,为什么会返回QTreeWidgetItem类型

一、解引用QTreeWidget类型的迭代器指针会返回QTreeWidgetItem类型&#xff0c;‌这是因为QTreeWidget类中的迭代器指向的是其包含的QTreeWidgetItem对象的指针。‌QTreeWidget是一个树形结构控件&#xff0c;‌用于在Qt应用程序中显示层次化的数据。‌每个QTreeWidgetItem代表…

「高效工具」精选5款录屏软件:探索最适合你的屏幕录制软件

现在屏幕录制已经成为我们工作、学习及娱乐的得力助手&#xff0c;一款高效、易用的录屏软件&#xff0c;可以帮助我们制作教学视频、直播分享以及记录游戏高光时刻等等。今天我们就给大家分享5款各具特色的录屏工具&#xff0c;需要的朋友快来看看哪一款适合你。 屏幕录制软件…

ONES 王颖奇:关于 ONES V6 发布的解读

经过近一年的产品研发&#xff0c;ONES 正式发布 V6 版。 结合 ONES 的产品成熟度阶段和近两年的市场变化&#xff0c;ONES V6 为以下几个场景做了能力深耕。 1. 系统兼容和部署方面&#xff0c;软件供应链国产化政策引导趋势明显&#xff0c;在金融等领域要求全栈信创支持。 …

day-39 矩阵中的最大得分

思路 动态规划。利用一个二维数组记录对应位置可以达到的最高得分&#xff08;位置&#xff08;0,0&#xff09;不可能&#xff09;&#xff0c;然后找出最大值即可&#xff08;如果除了&#xff08;0,0&#xff09;上的值其他值都一样&#xff0c;则返回任意一个即可&#xff…

css如何使一个盒子水平垂直居中

方法一&#xff1a;利用定位(常用方法,推荐&#xff09; <style> .parent{width: 500px;height: 500px;border: 1px solid #000;position:relative; }.child {width: 100px;height: 100px;border: 1px solid #999;position:absolute;top: 50%;left: 50%;margin-top: -50…

CVE-2024-38077:Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略

文章目录 CVE-2024-38077&#xff1a;Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略1 漏洞描述2 漏洞影响2.1 处置优先级&#xff1a;高2.2 影响版本 3 漏洞检测3.1 漏洞检测工具3.2 漏洞检测工具使用介绍3.2.1 漏洞检测工具当前支持三种方式检测3.2.2 漏洞…

linux下串口通信相关知识

三种工作模式 当ICANON 标志被设置时表示启用终端的规范模式&#xff0c;默认情况为规范模式。 规范模式下&#xff0c;所有的输入是基于行进行处理的。在用户输入一个行结束符&#xff08;回车符、EOF 等&#xff09;之前&#xff0c;系统调用read()函数是读不到用户输入的任…

第十一章:图论part06 108.冗余连接 109.冗余连接II (补)

任务日期&#xff1a;7.31 题目一链接&#xff1a;108. 冗余连接 (kamacoder.com) 思路&#xff1a;从前到后遍历边&#xff0c;如果当前两个点不在一个集合就使他们加入到一个集合&#xff0c;构成树&#xff0c;如果位于一个集合则输出他们&#xff0c;因为如果把他们加入就…