Consider this:
<ScrollViewer>
<!-- Several Controls /-->
<MyControl MouseMove="myMouseMoveHandler" />
<!-- Several Controls /-->
</ScrollViewer>
MyControl is a HSV color selection control with the color spectrum on a circle which can rotate, and the nuances of the selected hue on a triangle. It looks awesome, but sadly I cannot post a picture yet (rep). It really needs to be able to handle mouse movement in all directions on its surface.
Now when I move the mouse on MyControl (and it correctly handles the movement), the ScrollViewer still scrolls!
This happens even when it is the only control in the ScrollViewer, the movement starts and ends inside my control, and/or I set e.Handled = true in both the MouseLeftButtonDown / -Up events. Using CaptureMouse() in ..Down and ReleaseMouseCapture() in ..Up doesn't help either.
You will agree that I cannot change the ScrollViewer implementation (or can I?), and I cannot guarantee that my control is never hosted inside a ScrollViewer (eg. because I want to publish it).
It must be possible to prevent the ScrollViewer from getting the MouseMove. Proof: simply replace MyControl with a ListBox containing more items than fit into its Height, and you can swipe through the ListBox items without the ScrollViewer reacting.
But how? Is it also a ScrollViewer inside the ListBox and that's why it works there, or can it be done for my control too?