WPF 的采取了路由事件机制,这样事件可以在可视树上层级传递。要知道 XAML 中控件都是由很多其他元素组合而成,比如我们单击了 Button 内部的 TextBlock 元素,Button 依然可以可以接收到该事件并触发 Button.Click。通常情况下,我们只是关心逻辑树上的事件过程。

1)创建

public abstract class ButtonBase : ContentControl, ICommandSource
{
  public static readonly RoutedEvent ClickEvent;
  static ButtonBase()
  {
    ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, 
      typeof(RoutedEventHandler), typeof(ButtonBase));
    ......
  }
  public event RoutedEventHandler Click
  {
    add { base.AddHandler(ClickEvent, value); }
    remove { base.RemoveHandler(ClickEvent, value); }
  }
}

2)类型

注册路由事件时,我们可以选择不同的路由策略。

  管道传递(Tunneling): 事件首先在根元素上触发,然后向下层级传递,直到那个最初触发事件的子元素。

  冒泡(Bubbling): 事件从最初触发事件的子元素向根元素层级往上传递。

  直接(Direct): 事件仅在最初触发事件的子元素上触发。

<Border MouseRightButtonDown="MouseRightButtonDown" >

<StackPanel MouseRightButtonDown="MouseRightButtonDown">

<Button MouseRightButtonDown="MouseRightButtonDown" >Test</Button>

</StackPanel>

</Border>

当点击Button,弹出三个对话框,在按钮上单击右键后,你会依次看到显示 "Button"、"StackPanel"、"Border" 的三个对话框,显然事件按照冒泡向根元素传递。

通常情况下,WPF 控件会在管道事件的名称前添加 Preview 前缀。

3)附加事件

、和附加属性类似,WPF 允许我们在一个没有定义事件的元素上处理经管道或冒泡传递的路由事件。

4) Routed Events主要为键盘,鼠标等输入设备准备的。

Routed Commands包括:

ApplicationCommands, which contains things like Cut/Copy/Paste.
MediaCommands, which contains things like BoostBass/ChannelUp/ChannelDown/MuteVolume.
NavigationCommands, which contains things like BrowseBack/BrowseForward/Favorites.
ComponentCommands, which contains things like MoveDown/MoveFocusPageUp/MoveToEnd.
EditingCommands, which contains things like AlignCenter/Backspace/Delete.

WPF中的事件及冒泡事件和隧道事件(预览事件)的区别相关推荐

  1. Winforn中使用FastReport实现点击导出按钮PDF预览并弹出另存为对话框

    场景 FastReport安装包下载.安装.去除使用限制以及工具箱中添加控件: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  2. element表格图片放大_图片在表格中,鼠标经过图片上方,图片有放大预览效果 (vue+element )...

    element的鼠标移到图片时,放大预览效果.实现思路:element的 el-table + el-popover export default { data () { return { tabDa ...

  3. Xcode中的隐藏宝藏:模拟器里如何快速预览动态字体显示效果

    功能需求 在我们App适配动态字体后,如何快速预览不同动态字体的显示效果呢? 按照如上的操作在模拟器中会非常麻烦,那么有没有更简单的方法呢? 答案是肯定的! 从Xcode 10 开始,Apple为我们 ...

  4. vue中后端返回word文件下载地址,实现文件预览功能

    土豪选择: 如果不缺钱可以直接使用第三方预览收费的: 这里推荐给大家: 网址:https://view.xdocin.com/ 使用起来也非常的简单,只需要做一个地址拼接就可以使用 用法:(这里使用v ...

  5. 帆软中字体调小之后IE浏览器可以正常预览,谷歌浏览器却不生效

    今天遇到一个问题,在帆软设计器中把部分单元格字体设置的较小,但是预览的时候一直不生效. 后来使用IE浏览器测了一下是可以的,这就说明应该不是模板的问题,应该是浏览器自身原因. 后来查看谷歌浏览器设置, ...

  6. java中上传图片的原理_js实现图片上传预览原理分析

    目前网上有很多支持图片上传时进行预览的插件,功能完备,界面优雅,使用起来也很方便.一直以来也就只是用用,没有想过这些插件背后的实现原理.趁着今天有点时间,也来学习学习. 追根溯源 设想 一开始,按照我 ...

  7. 【SpringBoot】40、SpringBoot中使用Aspose将文件转为PDF实现在线预览

    一.简介 Aspose 是 .NET 和 Java 开发组件以及为 Microsoft SQL Server Reporting Services 和 JasperReports 等平台提供渲染扩展的 ...

  8. uniapp利用uview2.0中的uploadFile组件实现多张图片的增删预览上传功能

    效果图 <template><view><view class="main-intro" style="background-color: ...

  9. Ae项目中,GPU加速不能使用了。视频预览显示应不少于2个帧或多帧,以及VR效果不能使用GPU加速!

    首先,如果百度上的其他方法没有帮助到你.我这里还有另外一种方法. 点击文件菜单下的项目设置,看是否如图所示. 如果可以的话,点个关注支持一下:https://space.bilibili.com/73 ...

最新文章

  1. c语言调用视频播放软件,C语言播放视频
  2. AngularJS 使用ngOption实现下拉列表
  3. 水货刷XT702官方2.21添加google服务包
  4. PXC管理数据库服务器(引擎)
  5. IntelliJ Idea工具使用
  6. php获取回调url方法,php回调函数的实现方法介绍(代码)
  7. unity android 符号表,记录腾讯bugly关于符号表的配置
  8. Eigen密集矩阵求解 1 - 线性代数及矩阵分解
  9. Microsoft将在UWP上支持React Native,同时为VS Code添加工具软件
  10. 前端遇上Go: 静态资源增量更新的新实践
  11. 好看的表白墙LoveCards v1.0.4 源码(开源)
  12. 利用反射动态实例化类执行方法并传值
  13. 学习英语02——词汇——02
  14. 详解数据模型:概念模型、逻辑模型、物理模型
  15. java编程马拉松比赛_腾讯编程马拉松
  16. 关于推荐算法未来的思考:推荐诗与远方
  17. 教你如何利用python调用摄像头
  18. 前端学习笔记之HTML body内常用标签
  19. HIVE修改列顺序中的坑
  20. 分享即时通讯开发之实时音视频技术基础知识

热门文章

  1. 计算机中年级排名怎么操作,智学网如何查看年级排名 智学网看年级排名方法【详解】...
  2. ensp完成chap配置_广域网链路安全认证CHAP,一分钟了解下
  3. 小A点菜(洛谷-P1164)
  4. 数字三角形(洛谷-P1118)
  5. 信息奥赛一本通的递推练习
  6. android win8风格布局,Android仿Win8界面开发
  7. linux spf13 vim安装,Linux 下安装 spf13-VIM
  8. python 梯度提升树_机器学习:梯度提升算法|python与r语言代码实现
  9. Influxdb的更新操作
  10. 5-1WordCount单词计数