【问题标题】:RoutedEventArgs vs EventArgsRoutedEventArgs 与 EventArgs
【发布时间】:2017-03-15 00:02:56
【问题描述】:

我正在学习 WPF / Silverlight,并在 MS 视频广播中看到现在建议使用 RoutedEventArgs 而不是 EventArgs;虽然没有说明具体原因。

我有一个 win forms 应用程序,它使用“小部件”接口来尝试不绑定到特定的显示技术(在 Presenters / ViewModels 中),所以如果我的 IButton Click 事件现在需要采用 RoutedEventArgs我想它没有那么有用。

谁能解释我是否应该在所有情况下切换到RoutedEventArgs,为什么?

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

【问题讨论】:

    标签: .net wpf events routed-events


    【解决方案1】:

    嗯,基本上RoutedEvent 穿过Logical 树,从源元素到根元素(Bubble 事件路由),或者从根元素到子级别元素的频率较低(Tunnel 事件路由)。这意味着如果您在StackPanel 内部有一个Button,那么它本身就在Grid 内部;如果您在控件中定义Click 事件,除非其中一个处理它,否则它们都会触发它。

    如果事件路线是Bubble(命名为常规事件Click),它将去:

    Button -> StackPanel -> Grid

    如果事件路由是Tunnel(命名为PreviewClick),则相反:

    Grid -> StackPanel -> Button

    所以现在有了处理,这很简单。如果它是Bubble 路由并且ButtonRoutedEventArgs.Handled 设置为true,那么StackPanelGrid 将不会触发它。与RoutedEvent 相同,如果Grid 处理它,StackPanelButton 将不会触发它。

    这是我的理解,为了简单起见,我避免了一些东西。

    我推荐this chapter 以更好地了解此 WPF 功能。

    【讨论】:

    • @CodeBlend 没有痛苦,没有收获!
    • 简单明了的解释。在什么情况下需要使用 Tunnel 事件?我想不出任何实际用途。
    • 隧道 (PreviewClick) 发生在冒泡 (Click) 之前。你可以像我一样使用/滥用这个事实。当我的 WPF 应用程序用户单击按钮以显示子窗口时,我的隧道事件会关闭所有当前子窗口,然后我的冒泡事件会打开新的子窗口。
    【解决方案2】:

    RoutedEventArgs 是一种新类型的事件参数,用于支持 WPF 事件模型:路由事件。很难在简短的文章中解释 WPF 选择此模型的确切原因或意义何在,因此我将首先向您介绍有关该主题的一篇好文章。

    【讨论】:

      【解决方案3】:

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

      Button 元素应该能够处理点击事件,无论是被点击的图像还是被点击的文本框。

      因此 WPF 提供了一种方法:

      • 通过元素树传播事件大部分时间冒泡 从源元素(这里说图像)到更高级别的根元素(例如这里的按钮)。
      • 处理此类传播的事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多