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?

有帮助吗?

解决方案

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...

其他提示

Use e.OriginalSource as mentioned above. If you need to find the button, then you can use VisualTreeHelper.GetParent to find the actual Button control.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top