Browse Source

Implement IsPointerOver from enter/leave events.

pull/4/head
Steven Kirk 13 years ago
parent
commit
5e1a282886
  1. 53
      Perspex/Controls/Control.cs
  2. 24
      Perspex/Input/InputManager.cs

53
Perspex/Controls/Control.cs

@ -80,6 +80,12 @@ namespace Perspex.Controls
public static readonly PerspexProperty<double> WidthProperty =
PerspexProperty.Register<Control, double>("Width", double.NaN);
public static readonly RoutedEvent<PointerEventArgs> PointerEnterEvent =
RoutedEvent.Register<Control, PointerEventArgs>("PointerEnter", RoutingStrategy.Direct);
public static readonly RoutedEvent<PointerEventArgs> PointerLeaveEvent =
RoutedEvent.Register<Control, PointerEventArgs>("PointerLeave", RoutingStrategy.Direct);
public static readonly RoutedEvent<PointerEventArgs> PointerPressedEvent =
RoutedEvent.Register<Control, PointerEventArgs>("PointerPressed", RoutingStrategy.Bubble);
@ -96,6 +102,16 @@ namespace Perspex.Controls
{
this.classes = new Classes();
this.PointerEnter += (s, e) =>
{
this.IsPointerOver = true;
};
this.PointerLeave += (s, e) =>
{
this.IsPointerOver = false;
};
this.GetObservable(IsPointerOverProperty).Subscribe(x =>
{
if (x)
@ -112,33 +128,28 @@ namespace Perspex.Controls
this.GetObservable(BackgroundProperty).Skip(1).Subscribe(_ => this.InvalidateMeasure());
}
public event EventHandler<PointerEventArgs> PointerPressed
public event EventHandler<PointerEventArgs> PointerEnter
{
add
{
Contract.Requires<NullReferenceException>(value != null);
this.AddHandler(PointerPressedEvent, value);
}
add { this.AddHandler(PointerEnterEvent, value); }
remove { this.RemoveHandler(PointerEnterEvent, value); }
}
remove
{
Contract.Requires<NullReferenceException>(value != null);
this.RemoveHandler(PointerPressedEvent, value);
}
public event EventHandler<PointerEventArgs> PointerLeave
{
add { this.AddHandler(PointerLeaveEvent, value); }
remove { this.RemoveHandler(PointerLeaveEvent, value); }
}
public event EventHandler<PointerEventArgs> PointerPressed
{
add { this.AddHandler(PointerPressedEvent, value); }
remove { this.RemoveHandler(PointerPressedEvent, value); }
}
public event EventHandler<PointerEventArgs> PointerReleased
{
add
{
Contract.Requires<NullReferenceException>(value != null);
this.AddHandler(PointerReleasedEvent, value);
}
remove
{
Contract.Requires<NullReferenceException>(value != null);
this.RemoveHandler(PointerReleasedEvent, value);
}
add { this.AddHandler(PointerReleasedEvent, value); }
remove { this.RemoveHandler(PointerReleasedEvent, value); }
}
public Brush Background

24
Perspex/Input/InputManager.cs

@ -30,7 +30,7 @@ namespace Perspex.Input
switch (e.Type)
{
case RawMouseEventType.Move:
this.MouseMove((IVisual)e.Root, e.Position);
this.MouseMove((IMouseDevice)e.Device, (IVisual)e.Root, e.Position);
break;
case RawMouseEventType.LeftButtonDown:
this.MouseDown((IMouseDevice)e.Device, (IVisual)e.Root, e.Position);
@ -41,20 +41,36 @@ namespace Perspex.Input
}
}
private void MouseMove(IVisual visual, Point p)
private void MouseMove(IMouseDevice device, IVisual visual, Point p)
{
IEnumerable<IVisual> hits = visual.GetVisualsAt(p);
foreach (var control in this.pointerOvers.ToList().Except(hits).Cast<Control>())
{
PointerEventArgs e = new PointerEventArgs
{
RoutedEvent = Control.PointerLeaveEvent,
Device = device,
OriginalSource = control,
Source = control,
};
this.pointerOvers.Remove(control);
control.IsPointerOver = false;
control.RaiseEvent(e);
}
foreach (var control in hits.Except(this.pointerOvers).Cast<Control>())
{
PointerEventArgs e = new PointerEventArgs
{
RoutedEvent = Control.PointerEnterEvent,
Device = device,
OriginalSource = control,
Source = control,
};
this.pointerOvers.Add(control);
control.IsPointerOver = true;
control.RaiseEvent(e);
}
}

Loading…
Cancel
Save