From fa56056db67a21d9b1b38d852c37110ca97ee1fb Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 5 Feb 2015 21:40:39 +0100 Subject: [PATCH] Allow listening for already handled events. --- .../InteractiveTests.cs | 29 ++++++++++++- Perspex.Interactivity/Interactive.cs | 42 +++++++------------ 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/Perspex.Interactive.UnitTests/InteractiveTests.cs b/Perspex.Interactive.UnitTests/InteractiveTests.cs index 9e9610c1f9..659ee622df 100644 --- a/Perspex.Interactive.UnitTests/InteractiveTests.cs +++ b/Perspex.Interactive.UnitTests/InteractiveTests.cs @@ -192,10 +192,35 @@ namespace Perspex.Interactive.UnitTests 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(); + + EventHandler 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( RoutedEvent ev, EventHandler handler, - RoutingStrategies handlerRoutes) + RoutingStrategies handlerRoutes, + bool handledEventsToo = false) { TestInteractive target; @@ -224,7 +249,7 @@ namespace Perspex.Interactive.UnitTests foreach (var i in tree.GetSelfAndVisualDescendents().Cast()) { - i.AddHandler(ev, handler, handlerRoutes, false); + i.AddHandler(ev, handler, handlerRoutes, handledEventsToo); } return target; diff --git a/Perspex.Interactivity/Interactive.cs b/Perspex.Interactivity/Interactive.cs index e8e15a9cc7..c8dc22053d 100644 --- a/Perspex.Interactivity/Interactive.cs +++ b/Perspex.Interactivity/Interactive.cs @@ -73,23 +73,20 @@ namespace Perspex.Interactivity e.Source = e.Source ?? 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) - { - this.TunnelEvent(e); - } + if ((e.RoutedEvent.RoutingStrategies & RoutingStrategies.Tunnel) != 0) + { + this.TunnelEvent(e); + } - if ((e.RoutedEvent.RoutingStrategies & RoutingStrategies.Bubble) != 0) - { - this.BubbleEvent(e); - } + if ((e.RoutedEvent.RoutingStrategies & RoutingStrategies.Bubble) != 0) + { + this.BubbleEvent(e); } } @@ -102,11 +99,6 @@ namespace Perspex.Interactivity foreach (var target in this.GetSelfAndVisualAncestors().OfType()) { target.RaiseEventImpl(e); - - if (e.Handled) - { - break; - } } } @@ -119,11 +111,6 @@ namespace Perspex.Interactivity foreach (var target in this.GetSelfAndVisualAncestors().OfType().Reverse()) { target.RaiseEventImpl(e); - - if (e.Handled) - { - break; - } } } @@ -133,17 +120,16 @@ namespace Perspex.Interactivity List subscriptions; - e.RoutedEvent.InvokeRaised(this, e); - if (this.eventHandlers.TryGetValue(e.RoutedEvent, out subscriptions)) { foreach (var sub in subscriptions) { - bool invoke = + bool correctRoute = (e.Route == RoutingStrategies.Direct && sub.Routes == RoutingStrategies.Direct) || (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); }