C# WPF编程-事件

C# WPF编程-路由事件

  • 路由事件概要
    • 路由事件的三种方式
  • WPF事件
    • WPF最重要的5类事件:
    • 生命周期事件
  • 鼠标事件
  • 键盘事件
  • 多点触控输入
    • 原始触控

路由事件概要

路由事件是具有更强传播能力的事件,它们可在元素树中向上冒泡和向下隧道传播,并沿着传播路径被事件处理程序处理。

路由事件的三种方式

  1. 与普通.NET事件类似的直接路由事件(direct event)。
  2. 在包含层次中向上传递的冒泡路由事件(bubbling event)。
  3. 在包含层次中向下传递的隧道路由事件(tunneling event)。

定义、注册和封装路由事件

以Button的Click事件为例:

public abstract class ButtonBase: ContentControl,...
{
	// 定义事件
	public static readonly RouteEvent ClickEvent;
	
	// 注册事件
	static ButtonBase()
	{
		ButtonBase.ClickEvent = EventManager.RegisterRouteEvent("Click", 
		RoutingStrategy.Bullle, 
		typeof(RoutedEventHandler), typeof(ButtonBase));
		...
	}
	// 封装事件
	public event RoutedEventHandler Click
	{
		add
		{
			base.AddHandler(ButtonBase.ClickEvent, value);
		}
		remove
		{
			base.RemoveHandler(ButtonBase.ClickEvent, value);
		}
	} 
	...
}
  • 共享路由事件
    可在类之间共享路由事件的定义。
    如:UIElement.MouseUpEvent = Mouse.MouseUpEvent.AddOwner(typeof(UIElement));

  • 引发路由事件
    与所有事件类似,定义类需要在一定情况下引发事件。使用RaiseEvent()方法引发事件。
    如:RouteEventArgs e = new RouteEventArgs(ButtonBase.ClickEvent, this);
    base.RaiseEvent(e);

  • 处理路由事件
    XAML标签中定义:
    < Image Source=“1.png” Name=“img” MouseUp=“img_MouseUp” />
    C# 代码中:
    private void img_MouseUp(object sender, MouseButtonEventArgs e)
    {
    }

  1. 添加事件:

    • 代码中和XAML标记中同样效果:
      img.MouseUp += new MouseButtonEventHandler(img_MouseUp);

    • 更精简的语法,隐式地创建合适的委托对象:
      img.MouseUp += img_MouseUp;

    • 自行调用UIElement.AddHandler()方法直接连接事件:
      img.AddHandler(Image.MouseUpEvent, new MouseButtonEventHandler(img_MouseUp));

  2. 移除事件:

    • 使用-=运算符:
      img.MouseUp -= img_MouseUp;
    • 使用UIElement.RemoveHandler()方法:
      img.RemoveHandler(Image.MouseUpEvent, new MouseButtonEventHandler(img_MouseUp));

RouteEventArgs类:
在这里插入图片描述

附件事件:
所有按键的单击事件都会触发调用DoSomething事件处理函数
在这里插入图片描述
隧道事件:
隧道路由事件易于识别,它们都以Preview开头。WPF通常成对地定义冒泡路由事件和隧道路由事件。如冒泡事件MouseUp和隧道事件PrevieMouseUp。

WPF事件

WPF最重要的5类事件:

  1. **生命周期事件:**在元素被初始化、加载或卸载时发生这些事件。
  2. **鼠标事件:**操作鼠标时发生的事件。
  3. **键盘事件:**操作键盘时发生的事件。
  4. **手写笔事件:**操作手写笔时发生的事件。
  5. 多点触控事件: 操作触摸屏时发生的事件。

生命周期事件

在这里插入图片描述
在这里插入图片描述

鼠标事件

获取鼠标Move事件的鼠标坐标信息:

       private void Window_MouseMove(object sender, MouseEventArgs e)
       {
           Point pt = e.GetPosition(this);

           Console.WriteLine($"Window_MouseMove {pt.X}, {pt.Y}");
       }

在这里插入图片描述

 private void Window_MouseUp(object sender, MouseButtonEventArgs e)
 {
     Console.WriteLine("Window_MouseUp");
 }

 private void Window_MouseDown(object sender, MouseButtonEventArgs e)
 {
     Console.WriteLine("Window_MouseDown");
 }

 private void Window_MouseEnter(object sender, MouseEventArgs e)
 {
     Console.WriteLine("Window_MouseEnter");
 
 }

 private void Window_MouseLeave(object sender, MouseEventArgs e)
 {
     Console.WriteLine("Window_MouseLeave");
 }

 private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
 {
     Console.WriteLine("Window_MouseDoubleClick");
 }

 private void Window_MouseMove(object sender, MouseEventArgs e)
 {
     Point pt = e.GetPosition(this);

     Console.WriteLine($"Window_MouseMove {pt.X}, {pt.Y}");
 }
  • 鼠标捕获
    在这里插入图片描述

  • 鼠标拖放
    在这里插入图片描述

键盘事件

在这里插入图片描述

<Grid Button.Click="Grid_Click" KeyDown="Grid_KeyDown">
    <StackPanel>
        <Button Name="btn1" Width="20" Height="30" Margin="10" Click="btn1_Click">OK</Button>
        <TextBox TextInput="TextBox_TextInput"></TextBox>
    </StackPanel>
</Grid>

 private void Grid_KeyDown(object sender, KeyEventArgs e)
 {
     Console.WriteLine($"{e.Key.ToString()}");
 }

 private void TextBox_TextInput(object sender, TextCompositionEventArgs e)
 {
     Console.WriteLine($"{e.Text}");
 }

KeyboardDevice属性提供的方法:
在这里插入图片描述

多点触控输入

在这里插入图片描述

原始触控

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

稀碎从零算法笔记Day21-LeetCode:单词规律

题型&#xff1a;哈希表、字符串 链接&#xff1a;290. 单词规律 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&am…

uni-app从零开始快速入门

教程介绍 跨端框架uni-app作为新起之秀&#xff0c;在不到两年的时间内&#xff0c;迅速被广大开发者青睐和推崇&#xff0c;得益于它颠覆性的优势“快”&#xff0c;快到可以节省7套代码。本课程由uni-app开发者团队成员亲授&#xff0c;带领大家无障碍快速掌握完整的uni-app…

QT文件读写操作和内容提取

访问IO设备&#xff0c;需要先调用open()来设置正确的OpenMode(例如ReadOnly或ReadWrite) 打开设备后后&#xff0c;使用write() 或putChar() 写入数据到文件和设备&#xff0c;并通过调用read()&#xff0c;readLine() 或readAll() 进行读取&#xff1b;使用完设备后&#xf…

机器学习——决策树剪枝算法

机器学习——决策树剪枝算法 决策树是一种常用的机器学习模型&#xff0c;它能够根据数据特征的不同进行分类或回归。在决策树的构建过程中&#xff0c;剪枝算法是为了防止过拟合&#xff0c;提高模型的泛化能力而提出的重要技术。本篇博客将介绍剪枝处理的概念、预剪枝和后剪…

代码随想录算法训练营第二十四天| 回溯算法理论基础、LeetCode77. 组合

# 回溯算法理论基础 # Backtracking 理论基础视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili #LeetCode 77. Combinations #LeetCode 77. 视频讲解&#xff1a;带你学透回溯算法-组合问题&#xff08;对应力…

力扣爆刷第103天之CodeTop100五连刷1-5

力扣爆刷第103天之CodeTop100五连刷1-5 文章目录 力扣爆刷第103天之CodeTop100五连刷1-5一、3. 无重复字符的最长子串二、206. 反转链表三、146. LRU 缓存四、215. 数组中的第K个最大元素五、25. K 个一组翻转链表 一、3. 无重复字符的最长子串 题目链接&#xff1a;https://l…

Oracle数据库如果出现乱码,需要查看是否时字符集不一致导致乱码,这样解决

1、如果出现乱码&#xff0c;需要查看是否时字符集不一致导致乱码 以修改为ZHS16GBK字符集为例&#xff0c;具体字符集需要sql查询。 Oracle查看字符集 SELECT * FROM NLS_DATABASE_PARAMETERS p where p.PARAMETERNLS_CHARACTERSET; SELECT USERENV(language) FROM DUAL; 1.…

谷歌seo营销服务有哪些服务?

以我们举例&#xff0c;如果你在做B2B外贸建站&#xff0c;这里有全套保姆式托管服务&#xff0c;让你既省心又省力&#xff0c;七天就能搞定网站建设&#xff0c;快速上线&#xff0c;再来就是谷歌白帽SEO&#xff0c;我们这边强调的是纯白帽操作&#xff0c;专注于高质量的原…

Cmake和opencv环境安装

1 Cmake下载及安装 Download CMake 根据需要下载&#xff0c;历史版本下载方法如下 CMake 的版本号中的后缀 "rc1" 和 "rc2" 表示 Release Candidate 1 和 Release Candidate 2&#xff0c;它们都是候选版本&#xff0c;用于测试新功能和修复 bug。通常情…

uni-app里面如何使用图标

目录 一、导入 1.在官方&#xff08;iconfont-阿里巴巴矢量图标库&#xff09;选择自己想要的图标&#xff0c;加入购物车 2. 在点击购物车下载代码 3.解压文件夹 并更改名字 4.将文件夹&#xff08;iconfont&#xff09;整个放到项目中的static中 5.修改iconfont.css文件…

ctfshow-web入门-反序列化

web254 先看题 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-12-02 17:44:47 # Last Modified by: h1xa # Last Modified time: 2020-12-02 19:29:02 # email: h1xactfer.com # link: https://ctfer.com*/error_reporting(0); highlight_file(__FIL…

系统架构设计-构建系统应用

1. 系统架构目标与设计原则 在设计系统架构时&#xff0c;我们的目标是确保系统具有以下特点&#xff1a; 可靠性&#xff1a;系统能够持续稳定运行&#xff0c;保证业务可用性。可伸缩性&#xff1a;系统能够根据负载变化自动扩展或收缩&#xff0c;以应对不同的流量需求。容…

string类的详细模拟实现

string类的模拟实现 文章目录 string类的模拟实现前言1. 类的框架设计2. 构造函数与析构函数3. 拷贝构造与重载赋值运算符函数4. 运算符重载5. 成员函数6. 迭代器的实现7. 非成员函数8. 单元测试总结 前言 ​ 在现代编程中&#xff0c;字符串处理是每个程序员都会遇到的基本任…

Web核心简介

简介 web&#xff1a;全球广域网&#xff0c;也称万维网(www)&#xff0c;能够通过浏览器访问的网站 JavaWeb&#xff1a;是用Java技术来解决相关web互联网领域的技术栈 JavaWeb技术栈 B/S架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式&#xff0c;它的…

精神暴力的来源与解药

导致人生病的&#xff0c;不仅是病毒或细菌&#xff0c;也有精神暴力。与病毒破坏物理肌体、摧毁生命不同&#xff0c;精神暴力是让人们在过度的自我狂热中燃尽自我、而毁灭自身的。 21世纪以来&#xff0c;精神方面的疾病越来越多&#xff0c;为什么这样呢&#xff1f;大的背景…

【C语言进阶篇】动态内存管理

【C语言进阶篇】动态内存管理 &#x1f308;个人主页&#xff1a;开敲 &#x1f525;所属专栏&#xff1a;C语言 &#x1f33c;文章目录&#x1f33c; 1. 为什么要有动态内存分配 2.动态内存开辟和释放函数 2.1 动态内存释放函数 2.1.1 free函数 2.2 动态内存开辟函数 2.2.1 …

HTML元素语义化补充之css函数(三)

文章目录 CSS中的函数css函数–varcss函数–calccss函数–blurcss函数–gradientlinear-gradient的使用 CSS中的函数 ◼ 在前面我们有使用过很多个CSS函数: 比如rgb/rgba/translate/rotate/scale等; CSS函数通常可以帮助我们更加灵活的来编写样式的值&#xff1b; ◼ 下面有几…

自动驾驶轨迹规划之时空语义走廊(一)

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.摘要 2.系统架构 3.MPDM 4.时空语义走廊 ​4.1 种子生成 4.2 具有语义边界的cube inflation ​4.3 立方体松弛 本文解析了丁文超老师…

【机器学习300问】47、如何计算AUC?

一、AUC是什么&#xff1f; &#xff08;1&#xff09;文绉绉的定义 AUCArea Under the Curve中文直译叫“曲线下面积”&#xff0c;AUC名字里面的Curve曲线指的就是ROC曲线&#xff0c;关于ROC曲线的相关知识我已经在之前的文章中详细说过了&#xff0c;有需要的友友可以点击…

阿里云服务器(Ubuntu22)上的MySQL8数据库下载,安装和远程连接

最近阿里云centos主机到期了改为使用Ubuntu操作系统&#xff0c;在上面安装mysql并远程连接出现了一系列问题并解决。 之前在centos系统上下载mysql8的教程如下&#xff1a; 阿里云服务器&#xff08;centos7&#xff09;上的MySQL8数据库下载&#xff0c;安装和远程连接 主机操…