在Winforms中,我们(开发人员)通过事件处理用户交互。在WPF中,我们使用命令。
问题:
1. Winforms中的事件与WPF中的命令有何区别?我们必须使用哪种方法?以及何时使用?
2. Winforms中的事件与WPF中的路由事件有何区别?
问题:
1. Winforms中的事件与WPF中的命令有何区别?我们必须使用哪种方法?以及何时使用?
2. Winforms中的事件与WPF中的路由事件有何区别?
代表一个对象的命令可以序列化、传递到进程,总之,它更具有"灵活性"。
路由事件支持直接、冒泡和隧道策略, 此外,使用路由事件,您可以在事件参数中设置适当的标志来指示事件已被处理。
<Button>
<Border>
<Image>
</Border>
</Button>
Image
不会执行 Button.ClickEvent
,而是仅引发一个通用的 Click
事件,该事件首先由 Image
处理,然后由 Border
,最后由 Button
处理。 除非该事件被标记为已处理 (Handled
),否则该事件实际上会继续向上遍历 Visual Tree 直到达到 Window
对象。
这种路由事件类型称为冒泡事件,因为该事件从下至上遍历 Visual Tree。另一种事件类型是隧道事件,其中事件从上至下遍历 Visual Tree,或者是直接事件,只有单击的对象处理事件。
至于Routed Events
和Commands
之间的区别,它们提供两个不同的功能。事件是内置的,并与处理事件的UI对象相关联,而命令则不以任何方式与 UI 对象相关联,并提供内置支持以启用/禁用控件。
例如,具有 Click
事件的按钮将在 Click 事件处理程序中传递 Button 对象,而设置了 Command
属性的按钮将执行不相关的命令,并根据 Command.CanExecute()
自动启用/禁用按钮。
我使用 MVVM 设计模式,因此几乎总是使用 Commands (如果一个控件不支持 Command
属性,我会使用一个自定义的 Attached Command Behavior, 它允许我将命令附加到几乎任何 UI 事件上),但有时我仍然使用 Events 来执行仅影响视图且不执行任何业务逻辑的操作。