学习WPF——了解路由事件

入门

我们先来看一个例子


前台代码:


后台代码:

点击按钮的运行效果
第一个弹出窗口

第二个弹出窗口:


第三个弹出窗口:

说明


当点击按钮之后,先触发按钮的click事件,再上查找,发现stackpanel也注册了该事件,那么接着触发StackPanel的Button.Click事件,依次再触发Grid的Button.Click事件,这就是最基本的事件路由,事件路由的策略是右内向外的


如果不希望在XAML中注册路由事件,那么也可以通过编码的方式注册路由事件如下所示


如果想终止事件的向上传递,可以使用这种办法


上面的例子是一个冒泡路由事件,是由内向外传递的事件

WPF中还有一种事件是隧道路由事件,是由外向内传递的事件

路由事件解析

在上面的例子中我们看到了Button类的路由事件Click

下面我们来剖析源码,看看Button是如何注册这个路由事件的

要使用路由事件,必须先定义路由事件

首先在Button类的基类ButtonBase中发现了路由事件的定义ClickEvent

代码中使用EventManager.RegisterRoutedEvent注册了路由事件

这个方法包含事件的名称、路由类型等内容

定义了ClickEvent事件之后还需要对事件进行封装
这里使用到了.Net的事件封装器,
AddHandler和RemoveHandler用于添加和删除已注册的调用程序

修改记录

2015-1-5:完成一部分内容

2015-1-14:完成全部内容

参考资料

《Pro WPF 4.5 in C# 4th Edition》

http://www.cnblogs.com/DebugLZQ/archive/2012/12/03/2799314.html

 

时间: 2024-09-24 05:17:19

学习WPF——了解路由事件的相关文章

关于wpf路由事件的handled属性

问题描述 privatevoidTextBox_PreviewTextInput(objectsender,TextCompositionEventArgse){shortval;if(!Int16.TryParse(e.Text,outval)){e.Handled=true;}}小弟最近学习wpf看到这段路由事件,书上说Handled属性用来终止路由事件传播,可是这个方法为什么能阻止非数字的字符录入呢 解决方案 解决方案二:if(!Int16.TryParse(e.Text,outval))

代码-新手求问wpf程序中关于路由事件的问题

问题描述 新手求问wpf程序中关于路由事件的问题 我放了两个Button控件 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Grid1.AddHandler(Button.ClickEvent,new RoutedEventHandler(onClick)); } public void onClick(object sender, RoutedEventArgs e

WPF,自定义的路由事件为什么不冒泡

问题描述 项目中创建了一个继承自Control的自定义控件,名为"MyControl",并且创建了一个依赖项属性Value和一个冒泡路由事件ValueChanged事件.下面是使用MyControl的结构:<Gridlocal:MyControl.ValueChanged="grid_ValueChanged"><local:MyControl/><local:MyControl/><local:MyControl/>

Silverlight实用窍门系列:35.细解Silverlight冒泡路由事件和注册冒泡路由事件【附带实例源码】

Silverlight中的事件分为普通事件和冒泡路由事件,它并没有包括WPF中的隧道路由事件,在本章中将详细讲解冒泡路由事件和如何注册一个冒泡路由事件. 一.细解冒泡路由事件 冒泡路由事件可以比喻为:一个父对象X包含子对象A,在子对象A中没有事件处理程序,但是父对象X中有一个鼠标左击事件处理程序.当用户点击子孙对象A时,这个事件又鼠标左击冒泡传递到父对象X.父对象的事件处理程序就处理这次点击事件. 总结出来就是:冒泡路由事件是从子孙的元素传递到父对象事件处理程序中进行处理的一种解决方案,直到这个

.NET简谈路由事件

本篇文章讲解关于路由事件的相关原理. 什么叫路由事件,字面理解就是事件是可以传递,路由的意思也好理解.路由事件其实就是,事件是会随着某种变化,来回传递.路由事件其实在.NET2.0时期就已经存在了,只不过在一般开发过程中用不到. 从C#3.0开始,就已经封装了关于路由事件的机制.其实这种实现应该可以换个名字来解释.我们可以给路由事件起个便于理解的名字,"事件的路由设计模式".我们都知道,任何大的框架都是从微小的基本语法开始编写的,平台.语言给我们提供的仅仅是一些能满足日常需求的东西:好

HTML高级教程:学习HTML 4.0事件属性

高级|教程 HTML 4.0的新特性之一是使HTML事件触发浏览器中的行为,比方说当用户点击一个HTML元素时启动一段JavaScript.以下就是可被插入HTML标签以定义事件行为的一系列属性. 假如你希望学习如何使用这些事件进行编程,那么你应该学习我们的JavaScript教程和DHTML教程. 窗口事件 (Window Events) 仅在body和frameset元素中有效. 属性 值 描述 onload 脚本 当文档被载入时执行脚本 onunload 脚本 当文档被卸下时执行脚本 表单

winform或者wpf的ChangeUICues 事件

问题描述 winform或者wpf的ChangeUICues 事件 winform或者wpf的ChangeUICues 事件,到底是什么情况下触发? msdn的解释就一句话...焦点或键盘用户界面 (UI) 提示更改时发生 完全不明白 哪位同行给解释一下? 解决方案 https://msdn.microsoft.com/zh-cn/library/system.windows.forms.uicueseventargs_members(v=vs.90).aspx 看这个就清楚了. windows

[WPF] 动画Completed事件里获取执行该动画的UI对象

原文:[WPF] 动画Completed事件里获取执行该动画的UI对象 昨天群里有位童鞋提出如何在动画完成事件Completed里获取到执行该动画的UI对象. WPF里动画的Completed的本身并不会返回执行动画的UI对象,但我们可以利用附加属性Storyboard.TargetProperty来达到我们想要的效果. 步骤: 1 在执行动画前,先附加属性记录对象 DoubleAnimation ani = new DoubleAnimation(); ani.From = start; an

JavaScript事件学习小结(二)js事件处理程序_javascript技巧

相关阅读: JavaScript事件学习小结(五)js中事件类型之鼠标事件 http://www.jb51.net/article/86259.htm JavaScript事件学习小结(一)事件流 http://www.jb51.net/article/86261.htm javaScript事件学习小结(四)event的公共成员(属性和方法) http://www.jb51.net/article/86262.htm JavaScript事件学习小结(二)js事件处理程序 http://www