I would highly recommend starting with MSDN reading about routing events , however, from my point of view, the biggest difference is how they work.
Winforms allows you to assign a method to an event handler, and whenever this control event occurs, this handler starts. You can really do the same in WPF, or you can use the Routed Event.
An event is generated in a routed event (for example, a click event), and any element in the Visual Tree can subscribe to something during the Click event and can mark the event as processed or not.
For example, suppose you have a Button containing Border and Image
<Button> <Border> <Image> </Border> </Button>
Clicking on Image does not execute Button.ClickEvent , but instead simply raises a common Click event, which is first handled by Image , then Border , and then Button . The event will actually continue to work on VisualTree until it hits the Window object, unless one of the controls that handle the event is marked Handled
This type of โRoutingโ event is called a Bubbling event because the event moves or โbubblesโ up the visual tree. Another type of event is Tunneling , where the event moves down VisualTree or Direct , where only the object that received the click is processed.
As for the difference between Routed Events and Commands , they provide two separate functions. Events are embedded and associated with the user interface object that handles the event, while the command is not tied to the user interface object in any way and provides built-in support for enabling / disabling controls.
For example, a button with a Click event passes a Button object to a Click event handler, and a button with a set of Command properties executes an unrelated command and automatically enables / disables the button depending on Command.CanExecute()
I use the MVVM design pattern, so I almost always use commands (if the control does not support the Command property, I use the Behavior user attached command , which allows me to attach the command to almost any UI event), however I still use events sometimes when I want to do something that only affects viewing and does not do any business logic.