Search code examples
wpfuser-controlsrouted-events

WPF routed events handling in UserControl


I have a WPF UserControl that contains a button. I also have a WPF Window that contains a button. In both the UserControl and the Window I place the following line in XAML:

UIElement.PreviewMouseLeftButtonDown="OnPreviewMouseLeftButtonDown"

and in 'OnPreviewMouseLeftButtonDown' I've place a debug print that displays args.Source.

When I click on the button that is inside the window, I get the button as the EventArgs source. However, when I click the button that inside the UserControl (which is also inside a window, so I could test it, but not the same window) I get the UserControl as the EventArgs source.

I tired to see if there is some decorator around the UserControl (using snoop) but it seems straight forward.

I can't understand what is so special about UserControl in WPF that I don't get the right sender. Can someone please explain to me what am I missing?


Solution

  • While the question is old, I recently ran into a similar problem myself, involving the ContextMenuOpening event. Some amount of searching yielded the source code to UserControl here, which contains the following section:

        // Set the EventArgs' source to be this UserControl 
        internal override void AdjustBranchSource(RoutedEventArgs e)
        {
            e.Source=this;
        } 
    

    So, apparently UserControl sets the Source of ANY routed event to itself. I have no idea why it does this, though...