Handling MouseLeftButtonUp over different UIElements in Win Phone 8 - c#

I am having an issue with MouseLeftButtonUp not firing when I press my left mouse button down on one UIElement (i.e. a Rectangle) then move my mouse to another Rectangle and release the left mouse button.
According to this page http://msdn.microsoft.com/en-us/library/system.windows.uielement.mouseleftbuttonup.aspx it is because the event only fires when on the same element that the left mouse button was pressed down on,
Occurs when the left mouse button is released while the mouse pointer is over this element.
How can this problem be solved?
I tried adding a Grid element beneath both Rectangles to handle the MouseLeftButtonUp event and that didn't seem to solve the problem. When moving from Rect to Rect it doesn't fire, but when moving from Rect to Grid it fires. When moving from Grid to Rect it doesn't fire either. Different bubbling strategy?
Here is what I'm working with. Examine the second column where each Rectangle is YELLOW. They have been 'highlighted' by pressing on the top rectangle and dragging down to the bottom Rectangle. Once reaching the bottom rectangle I would like to be able to have the mouse button up event occur (by any means) to perform some action.. doesn't work!
If this seems like a weird solution to this type of 'highlight' mechanic or flat-out misuse of Rectangle in this situation don't be shy to say so, I'm new to WP8.

Consider adding a Grid over all the rectangles, that way you would get MouseButtonUp (as long as the mouse was released on the grid), but you would have to calculate which rectangle was moved over based on the MouseEventArgs.GetPosition.
You might also want to look into UIElement.CaptureMouse(), .ReleaseMouseCapture(). Capturing mouse means that the MouseButtonUp will be fired even when the mouse moves away from the MouseButtonDown-Rectangle, but the MouseMove and MouseButtonUp will be raised for the Capturing Rectangle (so you would still have to calculate the rectangles to highlight), until it calls ReleaseMouseCapture().

Related

WPF line hittest tolerance

I have a canvas where i draw a Line during mouse move. After I have the line, I want to show an overlay when the mouse is over/near the line. I know that I can use the MouseEnter and MouseLeave events from the Line object, but this is really hard when the Line object was created with a StrokeThickness of 1px. So how can I increase the MouseEnter or MouseLeave area to show my overlay even if the mouse pointer is not exactly on the line itself (some defined area around)?

Picturebox blocks MouseEnter event from firing?

as a part of my WinForms application, I want to move a picturebox (blue box) onto the grid as seen below.
I'm moving the picturebox according to the mouse positions (while the left mouse button is pressed down).
Now my problem is, that when dragging the picturebox over the grid, the MouseEnter event is supposed to be called (each box in the grid is a picturebox in itself, with the event attached to it). The event gets called when simply moving with the mouse over it, but as soon as I'm dragging the blue box over it, it doesn't.
So my question is, is it possible that the picturebox on top (blue box) blocks the MouseEnter event of the picturebox on the bottom from firing? And if so, is there a way to work around it? I've thought about using Drag&Drop, but this seemed as the easier solution.
Thanks in advance.

Sensitive border area between MouseEnter and MouseLeave events

I have a PictureBox control on my form for which I have written two events for MouseEnter and MouseLeave. On MouseEnter anther PictureBox enters the form and stands beside the original and with MouseLeave the second PictureBox goes way.
All works fine. Except when the cursor is on the original PictureBox’s border area the MouseEnter and MouseLeave events are repeatedly run. So the second image enters and leaves the form until the cursor is taken away. This makes a strange sight.
How can I avoid this situation?
The border area can be tricky, especially when you want to trigger something the might influence it even if it is only by a few pixels..
One classic situation is when you want to resize or move a control by clicking an dragging it at its border. Unless you use the internal calls and simply code mouseenter, -leave, -move, -down and -up you may well end up with e.g. moving the control away from the mouse and thereby triggering another leave event.
This often occurs only at one set of borders, like left&top or right&bottom.
You need to check you code for any such influences, like the new PictureBox pushing the old one away by a few pixels or a resize that makes it smaller; even one pixel can lead to the effect you see..
If the MouseEnter event is triggering a border to be drawn, or the size of the first PictureBox to change in any way, that can cause the effect you describe.
You could add a check against the mouse coordinates in MouseEnter to ensure that the mouse pointer gets far enough into the control's interior before the event fires. That would prevent an instant firing of the Leave event.

MouseEnter and MouseLeave processing in WPF (using VS2008 and .net 3.5) not working as expected

It is not easy to explain the problem without an image and without code. For those interested, I have made a sample C#/WPF project that can be downloaded from http://rapidshare.com/files/461745095/02.WPFControlEvents.rar
It is a very small project (45KB). The problem is as follows (with my apologies for the contorted description):
A "fancy" (and rather ugly) button contains a stackpanel which in turn contains 1.) a label, 2.) a canvas, 3.) two (2) concentric ellipses, all laid out from left to right.
There is a MouseEnter and a MouseLeave event handler for the stackpanel which displays a message in the title bar indicating whether the mouse is over the stackpanel or outside of it.
The problem is: when the mouse is over the label (in turn contained in the stackpanel), the mouse is (correctly) reported as being over the stackpanel. When the mouse is moved over the canvas (which is also contained in the stackpanel), the mouse is (incorrectly?) reported as not being over the stackpanel, yet when the mouse is moved a little further to the right (over the two ellipses, which are on the canvas), the mouse is reported to be over the stackpanel again.
Why is it that when the mouse is over the canvas it is reported as not being over the stackpanel but when the mouse is over the ellipses (which are painted on the canvas) it is reported as being on the stackpanel ?.
thank you for shedding light into the problem,
John.
Chances are you need to set the Background of the Canvas to Transparent. This will allow it to be "hit testable" and report mouse over events.
More info can be found here, but Canvas has a null background by default.

Drawing squares in WPF

I want to achieve the following with a WPF application (in a certain area/defined area):
When clicking and holding on the app, you can draw a square
You can do this as many times, but not overlap any squares
You can drag squares around the application
What do I need to achieve this, I assume a bunch of onclick/onmove's. Is there an easier way, such as using canvas? Any insight would be great.
You will have to use a canvas if you want the squares to appear where the user clicks and drags.
The mouse down event would define one corner and the mouse up the second. You'd have to constrain the movement of the cursor so that the x and y dimensions of the rectangle were the same.
On each mouse move event you'd have to check if the cursor were over one of the existing squares and prevent the square growing any further.
For the dragging of existing squares modify the mouse down event to check what's under the cursor. If it's the canvas start the square drawing mode, if it's a rectangle (square) then start the dragging mode. Again you'd need to use the mouse move event to check that the square doesn't intersect with any existing squares.
There's a code project article describing how to drag elements inside a Canvas: Dragging Elements in a Canvas
Speaking of ChrisF's mentioning of using a Canvas, I would suggest you use DragCanvas (found in the article)

Categories

Resources