diff --git a/Perspex/Input/InputManager.cs b/Perspex/Input/InputManager.cs index 0aa310fc41..9ab04b8e63 100644 --- a/Perspex/Input/InputManager.cs +++ b/Perspex/Input/InputManager.cs @@ -6,11 +6,15 @@ namespace Perspex.Input { + using System.Collections.Generic; + using System.Linq; using Perspex.Controls; using Perspex.Input.Raw; public class InputManager : IInputManager { + List pointerOvers = new List(); + public void Process(RawInputEventArgs e) { RawMouseEventArgs mouse = e as RawMouseEventArgs; @@ -39,16 +43,18 @@ namespace Perspex.Input private void MouseMove(IVisual visual, Point p) { - Control control = visual as Control; + IEnumerable hits = visual.GetVisualsAt(p); - if (control != null) + foreach (var control in this.pointerOvers.ToList().Except(hits).Cast()) { - control.IsPointerOver = visual.Bounds.Contains(p); + this.pointerOvers.Remove(control); + control.IsPointerOver = false; } - foreach (IVisual child in visual.VisualChildren) + foreach (var control in hits.Except(this.pointerOvers).Cast()) { - this.MouseMove(child, p - visual.Bounds.Position); + this.pointerOvers.Add(control); + control.IsPointerOver = true; } } diff --git a/Perspex/VisualExtensions.cs b/Perspex/VisualExtensions.cs index 265f91934f..628ecc5341 100644 --- a/Perspex/VisualExtensions.cs +++ b/Perspex/VisualExtensions.cs @@ -62,29 +62,30 @@ namespace Perspex { Contract.Requires(visual != null); + return visual.GetVisualsAt(p).LastOrDefault(); + } + + public static IEnumerable GetVisualsAt(this IVisual visual, Point p) + { + Contract.Requires(visual != null); + if (visual.Bounds.Contains(p)) { + yield return visual; + p -= visual.Bounds.Position; if (visual.VisualChildren.Any()) { foreach (IVisual child in visual.VisualChildren) { - IVisual hit = child.GetVisualAt(p); - - if (hit != null) + foreach (IVisual v in child.GetVisualsAt(p)) { - return hit; + yield return v; } } } - else - { - return visual; - } } - - return null; } public static IEnumerable GetVisualDescendents(this IVisual visual)