【问题标题】:What's difference between events in Winforms and commands in WPF?Winforms中的事件和WPF中的命令有什么区别?
【发布时间】:2012-06-20 13:49:17
【问题描述】:

在 Winforms 中,我们(开发人员)通过事件处理用户交互。 在 WPF 中,我们得到了命令。

问题:

  1. Winforms 中的事件和 WPF 中的命令有什么区别?我们必须使用哪种方法?什么时候?

  2. Winforms 中的事件和 WPF 中的路由事件有什么区别?

【问题讨论】:

标签: c# .net wpf winforms events


【解决方案1】:

我强烈建议您从阅读 MSDN's article on Routed Events 开始,但在我看来,最大的不同在于它们的工作方式

Winforms 允许您将方法分配给事件处理程序,并且每当引发该控件的事件时,该处理程序就会运行。您实际上可以在 WPF 中做同样的事情,或者您可以使用路由事件。

在Routed Event中,会产生一个事件(比如click事件),Visual Tree中的any元素可以在Click事件期间订阅做某事,并且可以将Event标记为已处理或未处理。

例如,假设您有一个 Button,其中包含一个 Border 和一个 Image

<Button>
    <Border>
        <Image>
    </Border>
</Button>

单击Image 不会执行Button.ClickEvent,而是简单地引发一个通用Click 事件,该事件首先由Image 处理,然后是Border,然后是Button。该事件实际上会在 VisualTree 上继续,直到它遇到 Window 对象,除非处理该事件的控件之一将其标记为 Handled

这种类型的路由事件称为Bubbling 事件,因为该事件沿可视树向上传播或“冒泡”。另一种事件类型是Tunneling,事件在VisualTree 中向下传播,或者Direct,只有被点击的对象才会处理事件。

至于Routed EventsCommands的区别,它们提供了两个独立的功能。事件是内置的,并与处理事件的 UI 对象绑定,而 Command 不以任何方式绑定到 UI 对象,并为启用/禁用控件提供内置支持。

例如,带有Click 事件的Button 会将Button 对象传递给Click 事件处理程序,而带有Command 属性集的Button 将执行不相关的命令并根据@ 自动启用/禁用按钮987654342@

我使用 MVVM 设计模式,所以几乎总是使用命令(如果控件不支持 Command 属性,我使用自定义的 Attached Command Behavior,它可以让我将命令附加到几乎任何 UI 事件),但是当我想做一些只影响视图而不做任何业务逻辑的事情时,我仍然偶尔会使用事件。

【讨论】:

    【解决方案2】:
    1. 由可以序列化的对象表示的命令,通过进程传递,无论如何,假设它更“灵活”。

    2. 路由事件支持next strategies - direct, bubbling and tunneling,也可以使用路由事件,您可以通过在事件参数中设置适当的标志来指示事件已被处理。

    【讨论】:

    • 1.在哪些情况下我们必须序列化命令?我不明白。 2. 谢谢。我忘记了标志。
    • @ZuTa - 这是一个全新的问题。提出一个问题并发布。
    • @sll - 谢谢。我创建了一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 2015-12-10
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多