Spiga
Posts - 80, Articles - 0, Comments - 364
Cnblogs
Dashboard
Login
Home
Contact
Gallery
RSS
Colin的技术
Focus on .NET
Avalon学习笔记 之 路由事件
2005-07-12 23:09 by Colin Han, 1476 visits,
收藏
,
编辑
Avalon中又一个非常吸引人的功能——路由事件(Routed Event).
在某些概念上和附加属性有些类似。
概述
Avalon提供了一套事件路由技术,从而我们可以在父节点上接收和处理子节点的事件。
下图是路由事件的会意图。
微软定义了两种路由事件,分别称为深入(Tunneling)事件和冒出(Bubbling)
(附:微软还定义了一种直接(Direct)事件,个人认为不能称之为路由事件)
对于深入事件,事件先由根节点进行处理,然后交由子节点处理,一级一级向下传,直到驱动这个事件的对象(如图Tunnel路径)。而冒出事件则正向反,现有驱动这个事件的对象处理,然后依次向上传递,直到根节点最后处理
(相应的,直接事件只交由驱动这个事件的对象处理,不进行传递)
。在整个处理路由的任何一个环节,都可以阻止这个事件的继续传递。
路由事件的事件参数必须从RoutedEventArgs继承,这个参数中包含一个属性Handled,事件处理函数可以通过将这个参数置为True而阻止路由事件的继续传递。
一个包含路由事件的对象的例子:
public
class
MyButtonSimple: Button
{
//
Create a custom routed event by first registering a RoutedEvent
//
This event uses the bubbling routing strategy
public
static
readonly
RoutedEvent TapEvent
=
EventManager.RegisterRoutedEvent(
"
Tap
"
, RoutingStrategy.Bubble,
typeof
(RoutedEventHandler),
typeof
(MyButtonSimple));
//
Provide CLR accessors for the event
public
event
RoutedEventHandler Tap
{
add
{ AddHandler(TapEvent, value); }
remove
{ RemoveHandler(TapEvent, value); }
}
//
This virtual method raises the Tap event
protected
virtual
void
OnTap()
{
RoutedEventArgs newEvent
=
new
RoutedEventArgs();
newEvent.RoutedEvent
=
MyButtonSimple.TapEvent;
RaiseEvent(newEvent);
}
//
For demonstration purposes we raise the event when the MyButtonSimple is clicked
protected
override
void
OnClick()
{
OnTap();
}
}
定义路由事件
必须使用EventManager.RegisterRoutedEvent注册一个路由事件
public
static
readonly
RoutedEvent TapEvent
=
EventManager.RegisterRoutedEvent(
"
Tap
"
,
RoutingStrategy.Bubble
,
typeof
(RoutedEventHandler),
typeof
(MyButtonSimple));
将它保存在一个只读静态成员中是为了将来更加容易的使用它。红色的部分声明这个路由事件的类型。例子中我们声明了一个冒出事件。
触发路由事件
为了使用它的路由功能,我们不能再使用传统的调用事件处理函数的逻辑,而必须使用下面的逻辑:
RoutedEventArgs newEvent
=
new
RoutedEventArgs();
newEvent.RoutedEvent
=
MyButtonSimple.TapEvent;
RaiseEvent(newEvent);
来驱动这个事件。
捕获事件
捕获路由事件分为两种情况,捕获本身的事件 和 捕获子节点的事件。
捕获本身的事件和传统的Windows应用一样的。下面是它们的语法:
C#:
MyButtonSimple button
=
new
MyButtonSimple();
button.Tap
+=
new
RoutedEventHandler(HandlerFunction);
XAML:
<
MyButtonSimple
Tap
="HandlerFunction"
>
button1
</
MyButtonSimple
>
捕获子节点上的事件采用下面的语法:
C#:
ButtonContainer.AddHandler(MyButtonSimple.TapEvent,
new
RoutedEventHandler(HandlerFunction));
XAML:
<
StackPanel
Name
="ButtonContainer"
Button.Click
="HandlerFunction"
>
绿色通道:
好文要顶
关注我
收藏该文
与我联系
Categories:
WPF
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
伊朗封杀Gmail和Facebook等互联网服务
·
分析称专利之争让谷歌苹果两败俱伤
·
Android平台发现新型手机病毒Rootsmart
·
HTC首款Android4.0手机大曝光
·
这是不是你期待的 iPad 3?
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
About
本站内容除特别声明,全部使用
创作共用(署名-非商业性使用)
2.5 中文版许可协议共享
如果你喜欢,请订阅我的博客
昵称:
Colin Han
园龄:
6年8个月
粉丝:
25
关注:
12
最新评论
Re:2012新年愿望
衷心祝福多多他爸的愿望都能实现! -- Aaron Lu
Re:64位XP操作系统下访问Access数据库的问题及解决
good -- 崔鹏飞
Re:100%测试覆盖率真的有用吗?
@
Colin Han
非常贴切 -- greatghoul
Re:100%测试覆盖率真的有用吗?
@
greatghoul
其实,MUDA是“麻达”(陕西方言,有麻烦,坏了的意思)
:) -- Colin Han
Re:100%测试覆盖率真的有用吗?
MUDA是不是妈的的意思? -- greatghoul
随笔分类
Rss
ASP.NET(1)
Rss
Bugs(4)
Rss
Component(8)
Rss
FxCop翻译(17)
Rss
Office(1)
Rss
Python(9)
Rss
WPF(12)
Rss
基本技术(11)
Rss
技术随想(5)
Rss
架构设计(3)
Rss
其它(21)
推荐排行榜
阅读排行榜
友情链接
GrapeCity Develop Network
Rss
Kevin Shan
Rss
WinkingZhang的博客
Rss
葡萄城控件技术团队博客