diff --git a/src/Perspex.Input/MouseDevice.cs b/src/Perspex.Input/MouseDevice.cs index 98833b230e..572ebd23ad 100644 --- a/src/Perspex.Input/MouseDevice.cs +++ b/src/Perspex.Input/MouseDevice.cs @@ -135,35 +135,32 @@ namespace Perspex.Input private void MouseMove(IMouseDevice device, IInputRoot root, Point p) { - IInteractive source; + IInputElement source; if (Captured == null) { - SetPointerOver(this, root, root, p); - source = root as IInteractive; + source = SetPointerOver(this, root, p); } else { - Point offset = new Point(); + var offset = new Point(); + var ancestors = Captured.GetVisualAncestors().OfType().ToList(); - foreach (IVisual ancestor in Captured.GetVisualAncestors()) + foreach (IVisual ancestor in ancestors) { offset += ancestor.Bounds.Position; } - SetPointerOver(this, root, Captured, p - offset); - source = Captured as IInteractive; + SetPointerOver(this, root, ancestors); + source = Captured; } - if (source != null) + source.RaiseEvent(new PointerEventArgs { - source.RaiseEvent(new PointerEventArgs - { - Device = this, - RoutedEvent = InputElement.PointerMovedEvent, - Source = source, - }); - } + Device = this, + RoutedEvent = InputElement.PointerMovedEvent, + Source = source, + }); } private void MouseUp(IMouseDevice device, IInputRoot root, Point p) @@ -237,11 +234,15 @@ namespace Perspex.Input root.PointerOverElement = null; } - private void SetPointerOver(IPointerDevice device, IInputRoot root, IInputElement element, Point p) + private IInputElement SetPointerOver(IPointerDevice device, IInputRoot root, Point p) { - IEnumerable hits = element.GetInputElementsAt(p); + var elements = root.GetInputElementsAt(p).ToList(); + return SetPointerOver(device, root, elements); + } - foreach (var control in _pointerOvers.Except(hits).ToList()) + private IInputElement SetPointerOver(IPointerDevice device, IInputRoot root, IList elements) + { + foreach (var control in _pointerOvers.Except(elements).ToList()) { PointerEventArgs e = new PointerEventArgs { @@ -254,7 +255,7 @@ namespace Perspex.Input control.RaiseEvent(e); } - foreach (var control in hits.Except(_pointerOvers)) + foreach (var control in elements.Except(_pointerOvers)) { PointerEventArgs e = new PointerEventArgs { @@ -267,7 +268,8 @@ namespace Perspex.Input control.RaiseEvent(e); } - root.PointerOverElement = hits.FirstOrDefault(); + root.PointerOverElement = elements.FirstOrDefault(); + return root.PointerOverElement; } } }