WPF 基础 - 点击事件的执行顺序及 Button 点击事件的特殊性
1. 点击事件的执行顺序
- PreviewMouseLeftButtonDown
- PreviewMouseDown
- MouseLeftButtonDown
- MouseDown
- PreviewMouseLeftButtonUp
- PreviewMouseUp
- Click
- MouseLeftButtonUp
- MouseUp
1)PreviewMouseLeftButtonDown 是隧道事件,从根节点往下传递
2)MouseLeftButtonDown 是冒泡事件,从下往根节点传递
3)知道这两点,再来看前面从 PreviewMouseLeftButtonDown 到 MouseUp 的整个过程及 Click 在当中所处的顺序,就好理解很多
4)具体:
鼠标即将点下,从根节点往下传递
->控件接受到鼠标点下,从下往根节点冒泡
->鼠标即将弹起,从上往下传递
->控件接受到鼠标要松开,若是 ButtonBase 等有 Click 事件的控件则触发 Click 事件
->控件从下往上冒泡鼠标弹起事件。
2. 例子
<StackPanel x:Name="s0" Height="100" Width="200" Background="Red"
PreviewMouseLeftButtonDown="PreviewMouseLeftButtonDownEventHandler"
PreviewMouseDown="PreviewMouseDownEventHandler"
MouseLeftButtonDown="MouseLeftButtonDownEventHandler"
MouseDown="MouseDownEventHandler"
PreviewMouseLeftButtonUp="PreviewMouseLeftButtonUpEventHandler"
PreviewMouseUp="PreviewMouseUpEventHandler"
MouseLeftButtonUp="MouseLeftButtonUpEventHandler"
MouseUp="MouseUpEventHandler">
<StackPanel x:Name="s1" Height="90" Width="180" Background="Yellow"
PreviewMouseLeftButtonDown="PreviewMouseLeftButtonDownEventHandler"
PreviewMouseDown="PreviewMouseDownEventHandler"
MouseLeftButtonDown="MouseLeftButtonDownEventHandler"
MouseDown="MouseDownEventHandler"
PreviewMouseLeftButtonUp="PreviewMouseLeftButtonUpEventHandler"
PreviewMouseUp="PreviewMouseUpEventHandler"
MouseLeftButtonUp="MouseLeftButtonUpEventHandler"
MouseUp="MouseUpEventHandler">
<Button x:Name="btn" Height="40" Width="78" Content="click"
Click="Button_ClickEventHandler"
MouseLeftButtonDown="MouseLeftButtonDownEventHandler"
PreviewMouseLeftButtonDown="PreviewMouseLeftButtonDownEventHandler"
PreviewMouseDown="PreviewMouseDownEventHandler"
MouseDown="MouseDownEventHandler"
PreviewMouseLeftButtonUp="PreviewMouseLeftButtonUpEventHandler"
PreviewMouseUp="PreviewMouseUpEventHandler"
MouseLeftButtonUp="MouseLeftButtonUpEventHandler"
MouseUp="MouseUpEventHandler">
</Button>
</StackPanel>
</StackPanel>
private void PrintControlAndEvent(string controlName, string routedEventName)
{
Console.WriteLine(string.Format("{0} : {1}", controlName, routedEventName));
}
private void PreviewMouseLeftButtonDownEventHandler(object sender, MouseButtonEventArgs e)
{
PrintControlAndEvent((sender as FrameworkElement).Name, e.RoutedEvent.ToString());
}
...
private void Button_ClickEventHandler(object sender, RoutedEventArgs e)
{
PrintControlAndEvent((sender as FrameworkElement).Name, e.RoutedEvent.ToString());
}
2.1 点击 Button
输出:
s0 : UIElement.PreviewMouseLeftButtonDown
s0 : Mouse.PreviewMouseDown
s1 : UIElement.PreviewMouseLeftButtonDown
s1 : Mouse.PreviewMouseDown
btn : UIElement.PreviewMouseLeftButtonDown
btn : Mouse.PreviewMouseDown
s0 : UIElement.PreviewMouseLeftButtonUp
s0 : Mouse.PreviewMouseUp
s1 : UIElement.PreviewMouseLeftButtonUp
s1 : Mouse.PreviewMouseUp
btn : UIElement.PreviewMouseLeftButtonUp
btn : Mouse.PreviewMouseUp
btn : ButtonBase.Click
2.2 点击 s1
输出:
s0 : UIElement.PreviewMouseLeftButtonDown
s0 : Mouse.PreviewMouseDown
s1 : UIElement.PreviewMouseLeftButtonDown
s1 : Mouse.PreviewMouseDown
s1 : UIElement.MouseLeftButtonDown
s1 : Mouse.MouseDown
s0 : UIElement.MouseLeftButtonDown
s0 : Mouse.MouseDown
s0 : UIElement.PreviewMouseLeftButtonUp
s0 : Mouse.PreviewMouseUp
s1 : UIElement.PreviewMouseLeftButtonUp
s1 : Mouse.PreviewMouseUp
s1 : UIElement.MouseLeftButtonUp
s1 : Mouse.MouseUp
s0 : UIElement.MouseLeftButtonUp
s0 : Mouse.MouseUp
2.3 点击 Button 后未能触发 MouseLeftButtonDown、MouseLeftButtonUp、MouseDown、MouseUp 的原因
button 的 mousedown 等已经被内部处理了,Handled 已被标记为 True。如果想强制执行,可以
btn.AddHandler(Button.MouseDownEvent, new MouseButtonEventHandler(MouseDownEventHandler), true);
btn.AddHandler(Button.MouseLeftButtonDownEvent, new MouseButtonEventHandler(MouseLeftButtonDownEventHandler), true);
btn.AddHandler(Button.MouseUpEvent, new MouseButtonEventHandler(MouseUpEventHandler), true);
btn.AddHandler(Button.MouseLeftButtonUpEvent, new MouseButtonEventHandler(MouseLeftButtonUpEventHandler), true);
第三个入参:
handledEventsToo:
//如果为 true,则将按以下方式注册处理程序:即使路由事件在其事件数据中标记为已处理,也会调用处理程序;
//如果为 false,则使用默认条件注册处理程序,即当路由事件被标记为已处理时,将不调用处理程序。
xaml 里写的 MouseLeftButtonDown="MouseLeftButtonDown" 的 handledEventsToo 值就是 false。
所以,在已经被内部处理的情况下,无法触发。
而即使在后台写 true,也只能触发 Button 的 MouseDownEvent,不会继续往上传递。
因为 handled 标记为 true,除非再把上层的控件也添加路由回调为 true。
WPF 基础 - 点击事件的执行顺序及 Button 点击事件的特殊性的更多相关文章
- 关于Unity物理事件的执行顺序的最新理解
物体A: public class A:{ B b; void FixedUpdate(){ if(input.GetKeyDow(Keycode.I)) { collider.enable=fals ...
- jquery ajax中事件的执行顺序
jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...
- 原生js事件和jquery事件的执行顺序问题
场景:近日,写前端页面时候,在针对输入框input操作时,用到了jquery的插件,插件中使用了jquery的focus()和blur()方法.但是同时,又需要在插件之外再针对输入框的获取焦点和失去焦 ...
- JAVA基础2——类初始化相关执行顺序
类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定 ...
- go语言基础之多个defer执行顺序
1. 多个defer执行顺序 如果一个函数中有多个defer语句,它们会以LIFO(后进先出)的顺序执行.哪怕函数或某个延迟调用发生错误,这些调用依旧会被执.示例: package main //必须 ...
- testng基础知识:注解的执行顺序
1. 单类,无继承父子关系 code: public class basicTest { @BeforeSuite(alwaysRun = true) public void beforeSuite_ ...
- - > 贪心基础入门讲解五——任务执行顺序
分析: 本题可以抽象成,从一个整数开始,每次减去a,再加上b (a,b都是正数),要求每次操作都不产生负数. 针对本题a[i] = R[i], b[i] = R[i] – O[i],注意O[i] &l ...
- Java 基础:继承中的执行顺序
1.单独的父类测试 Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分, 它们的执行顺序相对来说比较简单,用程序也很容易验证. 比如新建一个 ...
- iframe子页面点击按钮,执行父页面的点击事件
iframe 子页面点击.parent 父页面 的id(auth-link-btn)的事件 <a href="javascript:void(0);" onclick=&q ...
随机推荐
- Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本
Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本 前言 序言 再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点. 适合阅读人群 J ...
- 1.搭建NFS环境,用于存储数据
作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-12 14:59:50 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...
- proto3 协议指引
一.protocal buffer 是什么? 一种序列化机制. 什么是序列化? 一种转化为可存储和传输对象的过程. 序列化的方式有很多,那么proto有什么特殊的呢? 它的英文介绍里提到了neutra ...
- Dockfile搭建极简LNMP环境
最近才发现ThinkPHP6.0和CI4.x都要求php版本为7.1以上了,本机的php版本还停留在7.0.3x,又懒得升级,于是考虑使用Docker来运行一个lnmp环境. 常规环境搭建的方式有两种 ...
- Canvas & encryption image src
Canvas & encode image src 使用 Canvas 加密图片,防盗链 前端黑科技 https://telegram.org/ binary encode ??? https ...
- hardsource bug
hardsource bug webpack crashed bug memory stackoverflow [hardsource:32210703] Could not freeze refs ...
- WebGL Programming Guide All In One
WebGL Programming Guide All In One WebGL WebGL Programming Guide All In One Publication date: July 2 ...
- self-publishing ebook guide all in one
self-publishing ebook guide all in one 自助出版电子书指南 第1课:让我们自己出版一本书! 与您会想到的很多人相反,自我出版并不容易. 您不仅必须写书,而且还必须 ...
- MySQL 8.x
MySQL 8.x SQL & NoSQL $ mysql --version # mysql Ver 8.0.21 for osx10.15 on x86_64 (Homebrew) # M ...
- 前端监控平台 & 架构
前端监控平台 & 架构 1px 透明的 gif 字节小, 43 bytes 支持跨域, 兼容场景多,零配置 https://en.wikipedia.org/wiki/GIF demo htt ...