繁体   English   中英

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

[英]What's difference between events in Winforms and commands in WPF?

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

问题:

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

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

  1. 命令由一个可以序列化的对象代表,通过一个进程传递,无论如何,让我们说它更“灵活”。

  2. 路由事件支持下一个策略 - 直接,冒泡和隧道 ,也使用路由事件,您可以指示事件由事件参数中的settign处理。

我强烈建议您阅读MSDN关于路由事件的文章 ,但从我的观点来看,最大的区别在于它们是如何工作的

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

在路由事件中,会生成一个事件(例如单击事件),并且Visual Tree中的任何元素都可以订阅在Click事件期间执行某些操作,并且可以将事件标记为已处理。

例如,假设您有一个包含BorderImageButton

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

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

这种类型的Routed事件称为Bubbling事件,因为事件在Visual Tree中传播或“冒泡”。 另一种事件类型是Tunneling ,事件沿着VisualTree或Direct传播,其中只有被点击的对象处理事件。

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

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

我使用MVVM设计模式,所以几乎总是使用命令(如果控件不支持Command属性,我使用自定义附加命令行为 ,它允许我将命令附加到几乎任何UI事件),但是我仍然使用事件当我想做一些只影响View的事情并且不做任何业务逻辑时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM