Browse Source

Correctly dispatch PointerMoved events.

Fixes #130.
pull/137/head
Steven Kirk 11 years ago
parent
commit
90d7d81889
  1. 42
      src/Perspex.Input/MouseDevice.cs

42
src/Perspex.Input/MouseDevice.cs

@ -135,35 +135,32 @@ namespace Perspex.Input
private void MouseMove(IMouseDevice device, IInputRoot root, Point p) private void MouseMove(IMouseDevice device, IInputRoot root, Point p)
{ {
IInteractive source; IInputElement source;
if (Captured == null) if (Captured == null)
{ {
SetPointerOver(this, root, root, p); source = SetPointerOver(this, root, p);
source = root as IInteractive;
} }
else else
{ {
Point offset = new Point(); var offset = new Point();
var ancestors = Captured.GetVisualAncestors().OfType<IInputElement>().ToList();
foreach (IVisual ancestor in Captured.GetVisualAncestors()) foreach (IVisual ancestor in ancestors)
{ {
offset += ancestor.Bounds.Position; offset += ancestor.Bounds.Position;
} }
SetPointerOver(this, root, Captured, p - offset); SetPointerOver(this, root, ancestors);
source = Captured as IInteractive; source = Captured;
} }
if (source != null) source.RaiseEvent(new PointerEventArgs
{ {
source.RaiseEvent(new PointerEventArgs Device = this,
{ RoutedEvent = InputElement.PointerMovedEvent,
Device = this, Source = source,
RoutedEvent = InputElement.PointerMovedEvent, });
Source = source,
});
}
} }
private void MouseUp(IMouseDevice device, IInputRoot root, Point p) private void MouseUp(IMouseDevice device, IInputRoot root, Point p)
@ -237,11 +234,15 @@ namespace Perspex.Input
root.PointerOverElement = null; root.PointerOverElement = null;
} }
private void SetPointerOver(IPointerDevice device, IInputRoot root, IInputElement element, Point p) private IInputElement SetPointerOver(IPointerDevice device, IInputRoot root, Point p)
{ {
IEnumerable<IInputElement> 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<IInputElement> elements)
{
foreach (var control in _pointerOvers.Except(elements).ToList())
{ {
PointerEventArgs e = new PointerEventArgs PointerEventArgs e = new PointerEventArgs
{ {
@ -254,7 +255,7 @@ namespace Perspex.Input
control.RaiseEvent(e); control.RaiseEvent(e);
} }
foreach (var control in hits.Except(_pointerOvers)) foreach (var control in elements.Except(_pointerOvers))
{ {
PointerEventArgs e = new PointerEventArgs PointerEventArgs e = new PointerEventArgs
{ {
@ -267,7 +268,8 @@ namespace Perspex.Input
control.RaiseEvent(e); control.RaiseEvent(e);
} }
root.PointerOverElement = hits.FirstOrDefault(); root.PointerOverElement = elements.FirstOrDefault();
return root.PointerOverElement;
} }
} }
} }

Loading…
Cancel
Save