RoutedEventArgs与EventArgs的区别

21

我正在学习WPF/Silverlight,并在MS的视频中看到现在推荐使用RoutedEventArgs而不是EventArgs,尽管没有明确说明为什么。

我有一个Win Forms应用程序,它使用接口来处理“小部件”,以避免与特定显示技术(在Presenter/ViewModel中)绑定,因此,如果我的IButton Click事件现在需要使用RoutedEventArgs,那么我猜它就没那么有用了。

请问是否应该在所有情况下都切换到使用RoutedEventArgs,并说明原因?

顺便说一句,还有其他人使用我描述的接口小部件的经验/意见吗?

3个回答

38

简单来说,RoutedEvent 会通过 Logical 树传递,从源元素到根元素(Bubble 事件路由),或者较少地从根元素到子级元素(Tunnel 事件路由)。这意味着如果你在一个 Grid 中放置了一个 StackPanel,而在 StackPanel 中又放置了一个 Button,如果在这些控件中定义了 Click 事件,它们都会触发该事件,除非其中一个控件对其进行了处理。

如果事件路由是 Bubble(作为普通的事件 Click),它将按照以下顺序进行:

Button -> StackPanel -> Grid

如果事件路由是 Tunnel(命名为 PreviewClick),则将按相反的方式进行:

Grid -> StackPanel -> Button

现在,关于处理方法,很简单。如果是 Bubble 路由,并且 ButtonRoutedEventArgs.Handled 设置为 true,则 StackPanelGrid 将不会触发该事件。同样,如果 Grid 处理了 RoutedEvent,则 StackPanelButton 将不会触发它。

这是我简单的理解,为了简单起见,省略了一些内容。

我推荐阅读这一章节,以更好地理解WPF的这一特性。


1
@CodeBlend 没有付出就没有收获! - Carlo
1
简单明了的解释。在什么情况下需要使用隧道事件?我想不出任何实际用途。 - James Jeffery
隧道事件(PreviewClick)发生在冒泡事件(Click)之前。您可以像我一样利用/滥用这个事实。当我的WPF应用程序用户单击按钮以显示子窗口时,我的隧道事件会关闭所有当前的子窗口,然后我的冒泡事件会打开新的子窗口。 - John Doe

3
RoutedEventArgs是一种新型的事件参数,旨在支持WPF事件模型:路由事件。很难在简短的文章中解释WPF为什么选择这种模型或者它的意义,因此我会先向你介绍一篇关于这个主题的好文章。

0

假设我们有一个包含其他元素的Button元素,一个StackPanel,它本身包含一个TextBox和一个Image元素。

无论是单击了Image还是TextBox,Button元素都应该能够处理点击事件。

因此,WPF提供了一种方法:

  • 大多数情况下从源元素(这里是Image)向根元素(例如这里的按钮)传播事件。
  • 处理这样传播的事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接