Browse Source

Allow listening for already handled events.

pull/39/head
Steven Kirk 11 years ago
parent
commit
fa56056db6
  1. 29
      Perspex.Interactive.UnitTests/InteractiveTests.cs
  2. 42
      Perspex.Interactivity/Interactive.cs

29
Perspex.Interactive.UnitTests/InteractiveTests.cs

@ -192,10 +192,35 @@ namespace Perspex.Interactive.UnitTests
Assert.Equal(2, count); Assert.Equal(2, count);
} }
[Fact]
public void Event_Should_Should_Keep_Propogating_To_HandedEventsToo_Handlers()
{
var ev = new RoutedEvent(
"test",
RoutingStrategies.Bubble | RoutingStrategies.Tunnel,
typeof(RoutedEventArgs),
typeof(TestInteractive));
var invoked = new List<string>();
EventHandler<RoutedEventArgs> handler = (s, e) =>
{
invoked.Add(((TestInteractive)s).Id);
e.Handled = true;
};
var target = this.CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, true);
var args = new RoutedEventArgs(ev, target);
target.RaiseEvent(args);
Assert.Equal(new[] { "1", "2b", "2b", "1" }, invoked);
}
private TestInteractive CreateTree( private TestInteractive CreateTree(
RoutedEvent ev, RoutedEvent ev,
EventHandler<RoutedEventArgs> handler, EventHandler<RoutedEventArgs> handler,
RoutingStrategies handlerRoutes) RoutingStrategies handlerRoutes,
bool handledEventsToo = false)
{ {
TestInteractive target; TestInteractive target;
@ -224,7 +249,7 @@ namespace Perspex.Interactive.UnitTests
foreach (var i in tree.GetSelfAndVisualDescendents().Cast<Interactive>()) foreach (var i in tree.GetSelfAndVisualDescendents().Cast<Interactive>())
{ {
i.AddHandler(ev, handler, handlerRoutes, false); i.AddHandler(ev, handler, handlerRoutes, handledEventsToo);
} }
return target; return target;

42
Perspex.Interactivity/Interactive.cs

@ -73,23 +73,20 @@ namespace Perspex.Interactivity
e.Source = e.Source ?? this; e.Source = e.Source ?? this;
e.OriginalSource = e.OriginalSource ?? this; e.OriginalSource = e.OriginalSource ?? this;
if (!e.Handled) if (e.RoutedEvent.RoutingStrategies == RoutingStrategies.Direct)
{ {
if (e.RoutedEvent.RoutingStrategies == RoutingStrategies.Direct) e.Route = RoutingStrategies.Direct;
{ this.RaiseEventImpl(e);
e.Route = RoutingStrategies.Direct; }
this.RaiseEventImpl(e);
}
if ((e.RoutedEvent.RoutingStrategies & RoutingStrategies.Tunnel) != 0) if ((e.RoutedEvent.RoutingStrategies & RoutingStrategies.Tunnel) != 0)
{ {
this.TunnelEvent(e); this.TunnelEvent(e);
} }
if ((e.RoutedEvent.RoutingStrategies & RoutingStrategies.Bubble) != 0) if ((e.RoutedEvent.RoutingStrategies & RoutingStrategies.Bubble) != 0)
{ {
this.BubbleEvent(e); this.BubbleEvent(e);
}
} }
} }
@ -102,11 +99,6 @@ namespace Perspex.Interactivity
foreach (var target in this.GetSelfAndVisualAncestors().OfType<Interactive>()) foreach (var target in this.GetSelfAndVisualAncestors().OfType<Interactive>())
{ {
target.RaiseEventImpl(e); target.RaiseEventImpl(e);
if (e.Handled)
{
break;
}
} }
} }
@ -119,11 +111,6 @@ namespace Perspex.Interactivity
foreach (var target in this.GetSelfAndVisualAncestors().OfType<Interactive>().Reverse()) foreach (var target in this.GetSelfAndVisualAncestors().OfType<Interactive>().Reverse())
{ {
target.RaiseEventImpl(e); target.RaiseEventImpl(e);
if (e.Handled)
{
break;
}
} }
} }
@ -133,17 +120,16 @@ namespace Perspex.Interactivity
List<Subscription> subscriptions; List<Subscription> subscriptions;
e.RoutedEvent.InvokeRaised(this, e);
if (this.eventHandlers.TryGetValue(e.RoutedEvent, out subscriptions)) if (this.eventHandlers.TryGetValue(e.RoutedEvent, out subscriptions))
{ {
foreach (var sub in subscriptions) foreach (var sub in subscriptions)
{ {
bool invoke = bool correctRoute =
(e.Route == RoutingStrategies.Direct && sub.Routes == RoutingStrategies.Direct) || (e.Route == RoutingStrategies.Direct && sub.Routes == RoutingStrategies.Direct) ||
(e.Route != RoutingStrategies.Direct && (e.Route & sub.Routes) != 0); (e.Route != RoutingStrategies.Direct && (e.Route & sub.Routes) != 0);
bool notFinished = !e.Handled || sub.AlsoIfHandled;
if (invoke) if (correctRoute && notFinished)
{ {
sub.Handler.DynamicInvoke(this, e); sub.Handler.DynamicInvoke(this, e);
} }

Loading…
Cancel
Save