From 82c8091e4b134c07995e8ed8f434c4d93ddc7b3e Mon Sep 17 00:00:00 2001 From: Johan Laanstra Date: Tue, 5 Aug 2014 18:24:59 +0200 Subject: [PATCH 1/6] Fix bug with deactivation. --- ReactiveUI/Xaml/ActivationForViewFetcher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReactiveUI/Xaml/ActivationForViewFetcher.cs b/ReactiveUI/Xaml/ActivationForViewFetcher.cs index 5d18d4b783..cd66729aca 100644 --- a/ReactiveUI/Xaml/ActivationForViewFetcher.cs +++ b/ReactiveUI/Xaml/ActivationForViewFetcher.cs @@ -36,7 +36,7 @@ public IObservable GetActivationForView(IActivatable view) return viewLoaded .Merge(viewUnloaded) - .Select(b => b ? fe.WhenAnyValue(x => x.IsHitTestVisible).Where(hv => hv && b) : Observable.Empty()) + .Select(b => b ? fe.WhenAnyValue(x => x.IsHitTestVisible).Where(hv => hv && b) : Observable.Return(b)) .Switch() .DistinctUntilChanged(); } From 9abef62489100994f3cc53f5404926c94eaed0e3 Mon Sep 17 00:00:00 2001 From: Johan Laanstra Date: Tue, 5 Aug 2014 18:29:06 +0200 Subject: [PATCH 2/6] This should be select. --- ReactiveUI/Xaml/ActivationForViewFetcher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReactiveUI/Xaml/ActivationForViewFetcher.cs b/ReactiveUI/Xaml/ActivationForViewFetcher.cs index cd66729aca..9b98a30e53 100644 --- a/ReactiveUI/Xaml/ActivationForViewFetcher.cs +++ b/ReactiveUI/Xaml/ActivationForViewFetcher.cs @@ -36,7 +36,7 @@ public IObservable GetActivationForView(IActivatable view) return viewLoaded .Merge(viewUnloaded) - .Select(b => b ? fe.WhenAnyValue(x => x.IsHitTestVisible).Where(hv => hv && b) : Observable.Return(b)) + .Select(b => b ? fe.WhenAnyValue(x => x.IsHitTestVisible).Select(hv => hv && b) : Observable.Return(b)) .Switch() .DistinctUntilChanged(); } From 0bd55b9bc3375f106fad859b385c01910b835fdd Mon Sep 17 00:00:00 2001 From: Johan Laanstra Date: Tue, 5 Aug 2014 21:54:53 +0200 Subject: [PATCH 3/6] Add tests for ActivationForViewFetcher. --- .../Xaml/ActivationForViewFetcherTest.cs | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 ReactiveUI.Tests/Xaml/ActivationForViewFetcherTest.cs diff --git a/ReactiveUI.Tests/Xaml/ActivationForViewFetcherTest.cs b/ReactiveUI.Tests/Xaml/ActivationForViewFetcherTest.cs new file mode 100644 index 0000000000..07c69a563f --- /dev/null +++ b/ReactiveUI.Tests/Xaml/ActivationForViewFetcherTest.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Xunit; + +namespace ReactiveUI.Tests +{ + public class ActivationForViewFetcherTest + { + public class TestUserControl : UserControl, IActivatable + { + public TestUserControl() + { + + } + } + + [Fact] + public void FrameworkElementIsActivatedAndDeactivated() + { + var uc = new TestUserControl(); + var activation = new ActivationForViewFetcher(); + + var obs = activation.GetActivationForView(uc); + var activated = obs.CreateCollection(); + + RoutedEventArgs loaded = new RoutedEventArgs(); + loaded.RoutedEvent = FrameworkElement.LoadedEvent; + + uc.RaiseEvent(loaded); + + new[] { true }.AssertAreEqual(activated); + + RoutedEventArgs unloaded = new RoutedEventArgs(); + unloaded.RoutedEvent = FrameworkElement.UnloadedEvent; + + uc.RaiseEvent(unloaded); + + new[] { true, false }.AssertAreEqual(activated); + } + + [Fact] + public void IsHitTestVisibleActivatesFrameworkElement() + { + var uc = new TestUserControl(); + uc.IsHitTestVisible = false; + var activation = new ActivationForViewFetcher(); + + var obs = activation.GetActivationForView(uc); + var activated = obs.CreateCollection(); + + RoutedEventArgs loaded = new RoutedEventArgs(); + loaded.RoutedEvent = FrameworkElement.LoadedEvent; + + uc.RaiseEvent(loaded); + + // IsHitTestVisible still false + new bool[0].AssertAreEqual(activated); + + uc.IsHitTestVisible = true; + + // IsHitTestVisible true + new[] { true }.AssertAreEqual(activated); + + RoutedEventArgs unloaded = new RoutedEventArgs(); + unloaded.RoutedEvent = FrameworkElement.UnloadedEvent; + + uc.RaiseEvent(unloaded); + + new[] { true, false }.AssertAreEqual(activated); + } + + [Fact] + public void IsHitTestVisibleDeactivatesFrameworkElement() + { + var uc = new TestUserControl(); + var activation = new ActivationForViewFetcher(); + + var obs = activation.GetActivationForView(uc); + var activated = obs.CreateCollection(); + + RoutedEventArgs loaded = new RoutedEventArgs(); + loaded.RoutedEvent = FrameworkElement.LoadedEvent; + + uc.RaiseEvent(loaded); + + new[] { true }.AssertAreEqual(activated); + + uc.IsHitTestVisible = false; + + new[] { true, false }.AssertAreEqual(activated); + } + } +} From 61f85d8234db783a83b965f86501b6aa70ae6116 Mon Sep 17 00:00:00 2001 From: Johan Laanstra Date: Tue, 5 Aug 2014 21:55:16 +0200 Subject: [PATCH 4/6] Skip initial false values. --- ReactiveUI/Xaml/ActivationForViewFetcher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReactiveUI/Xaml/ActivationForViewFetcher.cs b/ReactiveUI/Xaml/ActivationForViewFetcher.cs index 9b98a30e53..87d12d16bc 100644 --- a/ReactiveUI/Xaml/ActivationForViewFetcher.cs +++ b/ReactiveUI/Xaml/ActivationForViewFetcher.cs @@ -36,7 +36,7 @@ public IObservable GetActivationForView(IActivatable view) return viewLoaded .Merge(viewUnloaded) - .Select(b => b ? fe.WhenAnyValue(x => x.IsHitTestVisible).Select(hv => hv && b) : Observable.Return(b)) + .Select(b => b ? fe.WhenAnyValue(x => x.IsHitTestVisible).Select(hv => hv && b).SkipWhile(x => !x) : Observable.Return(b)) .Switch() .DistinctUntilChanged(); } From 663d0556e3da12021bafa1f49f604a1c0bedac04 Mon Sep 17 00:00:00 2001 From: Johan Laanstra Date: Tue, 5 Aug 2014 21:55:28 +0200 Subject: [PATCH 5/6] And the project file. --- ReactiveUI.Tests/ReactiveUI.Tests_Net45.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/ReactiveUI.Tests/ReactiveUI.Tests_Net45.csproj b/ReactiveUI.Tests/ReactiveUI.Tests_Net45.csproj index d509216fb5..7a7159cf00 100644 --- a/ReactiveUI.Tests/ReactiveUI.Tests_Net45.csproj +++ b/ReactiveUI.Tests/ReactiveUI.Tests_Net45.csproj @@ -114,6 +114,7 @@ + From beaf5fc3399833f6a8b588b938cdad377c0a6dab Mon Sep 17 00:00:00 2001 From: Johan Laanstra Date: Tue, 5 Aug 2014 22:00:00 +0200 Subject: [PATCH 6/6] Another test. --- .../Xaml/ActivationForViewFetcherTest.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ReactiveUI.Tests/Xaml/ActivationForViewFetcherTest.cs b/ReactiveUI.Tests/Xaml/ActivationForViewFetcherTest.cs index 07c69a563f..485727e114 100644 --- a/ReactiveUI.Tests/Xaml/ActivationForViewFetcherTest.cs +++ b/ReactiveUI.Tests/Xaml/ActivationForViewFetcherTest.cs @@ -94,5 +94,39 @@ public void IsHitTestVisibleDeactivatesFrameworkElement() new[] { true, false }.AssertAreEqual(activated); } + + [Fact] + public void FrameworkElementIsActivatedAndDeactivatedWithHitTest() + { + var uc = new TestUserControl(); + var activation = new ActivationForViewFetcher(); + + var obs = activation.GetActivationForView(uc); + var activated = obs.CreateCollection(); + + RoutedEventArgs loaded = new RoutedEventArgs(); + loaded.RoutedEvent = FrameworkElement.LoadedEvent; + + uc.RaiseEvent(loaded); + + new[] { true }.AssertAreEqual(activated); + + // this should deactivate it + uc.IsHitTestVisible = false; + + new[] { true, false }.AssertAreEqual(activated); + + // this should activate it + uc.IsHitTestVisible = true; + + new[] { true, false, true }.AssertAreEqual(activated); + + RoutedEventArgs unloaded = new RoutedEventArgs(); + unloaded.RoutedEvent = FrameworkElement.UnloadedEvent; + + uc.RaiseEvent(unloaded); + + new[] { true, false, true, false }.AssertAreEqual(activated); + } } }