How to get the clicked object from a MouseLeftButtonUp event registered on a parent container?

1.9k Views Asked by At

I have ellipses drawn on top of a canvas, I've registered a MouseLeftButtonUp on the Canvas, and I and want to get what ellipse was clicked using:

(Ellipse)e.Source

But e.Source is always the canvas, I also tried e.OriginalSource and also did the same thing with PreviewMouseLeftButtonUp, but still same result. Event arg is MouseButtonEventArgs. What am I doing wrong? also is there a way to check if there is a child element of a canvas at a specific point.

3

There are 3 best solutions below

0
On

I just ran into this issue and this was the first answer to pop up. It was working for me on MouseLeftButtonDown but not on MouseLeftButtonUp. This was because of a logic error I had made with capturing the mouse in my MouseDown handler.

MouseUp events only fire on the element that is captured if you are capturing the element.

I had the following line in my MouseLeftButtonDown handler:

((FrameworkElement) sender).CaptureMouse();

Changing that to the following fixed the problem:

((FrameworkElement) e.OriginalSource).CaptureMouse();
0
On

Use e.OriginalSource instead.

0
On

You probably want PreviewMouseLeftButtonUp, not MouseLeftButtonUp. Also, you may need to register your event using Ellipse.PreviewMouseLeftButtonUp, rather than the MouseUp event on Canvas. Something like this:

<Canvas ... Ellipse.PreviewMouseLeftButtonUp="MyHandler" />

And as H.B. mentioned, you want to use e.OriginalSource, not e.Source.

EDIT: Misread the question, editing to change to PreviewMouse*LeftButton*Up