在 Winforms 中,我们(开发人员)通过事件处理用户交互。在 WPF 中,我们得到了命令。
问题 :
Winforms中的事件和WPF中的命令有什么区别?我们必须使用哪种方法?什么时候?
Winforms 中的事件和 WPF 中的路由事件有什么区别?
由可以序列化的对象表示的命令,可以通过进程传递,无论如何,让我们说它更“灵活”。
路由事件支持下一个策略 - 直接、冒泡和隧道,也使用路由事件,您可以通过在事件参数中设置适当的标志来指示事件已处理。
我强烈建议您从阅读MSDN 关于 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
这种类型的 Routed 事件称为Bubbling
事件,因为事件在可视树上传播或“冒泡”。另一种事件类型是Tunneling
,事件沿着 VisualTree 传播,或者Direct
,只有被点击的对象处理事件。
至于 和 之间的区别Routed Events
,Commands
它们提供了两个独立的功能。事件是内置的,并且与处理事件的 UI 对象相关联,而 Command 不以任何方式与 UI 对象相关联,并为启用/禁用控件提供内置支持。
例如,带有Click
事件的 Button 会将 Button 对象传递给 Click 事件处理程序,而带有Command
属性集的 Button 将执行不相关的命令并根据具体情况自动启用/禁用按钮Command.CanExecute()
我使用 MVVM 设计模式,所以几乎总是使用命令(如果控件不支持该Command
属性,我使用自定义的附加命令行为,它可以让我将命令附加到几乎任何 UI 事件),但是我有时仍然使用事件当我想做一些只影响视图而不做任何业务逻辑的事情时。