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)
{
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<IInputElement>().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<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
{
@ -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;
}
}
}

Loading…
Cancel
Save