Winforms中的事件和WPF中的命令有什么区别?

5
在Winforms中,我们(开发人员)通过事件处理用户交互。在WPF中,我们使用命令。
问题:
1. Winforms中的事件与WPF中的命令有何区别?我们必须使用哪种方法?以及何时使用?
2. Winforms中的事件与WPF中的路由事件有何区别?

我强烈建议首先阅读MSDN关于路由事件的文章 - Rachel
1
WPF 中还有普通事件,命令和路由事件只是额外的补充。 - H.B.
2个回答

3
  1. 代表一个对象的命令可以序列化、传递到进程,总之,它更具有"灵活性"。

  2. 路由事件支持直接、冒泡和隧道策略, 此外,使用路由事件,您可以在事件参数中设置适当的标志来指示事件已被处理。


  1. 我不明白在哪些情况下我们必须序列化命令?
  2. 谢谢。我忘记了标志。
- ZuTa
1
@ZuTa - 这是一个全新的问题。请提出一个单一的问题并发布它。 - Security Hound
@sll - 谢谢。我已经创建了一个新问题。 - ZuTa

2
我强烈建议您首先阅读MSDN关于路由事件的文章,链接为:MSDN's article on Routed Events。然而从我的角度来看,最大的区别在于它们的工作方式。
Winforms允许您将方法分配给事件处理程序,每当该控件的事件被触发时,该处理程序就会运行。在WPF中,您实际上也可以做同样的事情,或者您可以使用路由事件。
在路由事件中,会生成一个事件(例如单击事件),并且可视树中的任何元素都可以订阅并在单击事件期间执行某些操作,并且可以标记事件是否已处理。
例如,假设您有一个包含Border和Image的Button。
<Button>
    <Border>
        <Image>
    </Border>
</Button>

单击 Image 不会执行 Button.ClickEvent,而是仅引发一个通用的 Click 事件,该事件首先由 Image 处理,然后由 Border,最后由 Button 处理。 除非该事件被标记为已处理 (Handled),否则该事件实际上会继续向上遍历 Visual Tree 直到达到 Window 对象。

这种路由事件类型称为冒泡事件,因为该事件从下至上遍历 Visual Tree。另一种事件类型是隧道事件,其中事件从上至下遍历 Visual Tree,或者是直接事件,只有单击的对象处理事件。

至于Routed EventsCommands之间的区别,它们提供两个不同的功能。事件是内置的,并与处理事件的UI对象相关联,而命令则不以任何方式与 UI 对象相关联,并提供内置支持以启用/禁用控件。

例如,具有 Click 事件的按钮将在 Click 事件处理程序中传递 Button 对象,而设置了 Command 属性的按钮将执行不相关的命令,并根据 Command.CanExecute() 自动启用/禁用按钮。

我使用 MVVM 设计模式,因此几乎总是使用 Commands (如果一个控件不支持 Command 属性,我会使用一个自定义的 Attached Command Behavior, 它允许我将命令附加到几乎任何 UI 事件上),但有时我仍然使用 Events 来执行仅影响视图且不执行任何业务逻辑的操作。


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