diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2017-03-29 02:52:45 -0600 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2017-03-29 09:52:45 +0100 |
commit | e55efa2a8e1164d805bc76b0f3ce84999d2f1bb8 (patch) | |
tree | 62ef93abac6215010ca9fe719ee03fc414e88bfe /Xamarin.Forms.Platform.WinRT | |
parent | 90582e977734d40d2023537186ebcf79f826291e (diff) | |
download | xamarin-forms-e55efa2a8e1164d805bc76b0f3ce84999d2f1bb8.tar.gz xamarin-forms-e55efa2a8e1164d805bc76b0f3ce84999d2f1bb8.tar.bz2 xamarin-forms-e55efa2a8e1164d805bc76b0f3ce84999d2f1bb8.zip |
Align iOS, Android, Windows handling of tap gesture event bubbling (#842)
* Add test for gesture bubbling behavior on all controls;
Make Windows behavior consistent with other platforms;
* Fix the stepper test
* Make Frame on Android handle tap event bubbling like the other platforms
* Formatting changes and query syntax instead of SelectMany
Diffstat (limited to 'Xamarin.Forms.Platform.WinRT')
8 files changed, 64 insertions, 2 deletions
diff --git a/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs b/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs index 1b3960e0..9f662f0c 100644 --- a/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs @@ -99,6 +99,8 @@ namespace Xamarin.Forms.Platform.WinRT return; } + protected override bool PreventGestureBubbling { get; set; } = true; + void OnButtonClick(object sender, RoutedEventArgs e) { ((IButtonController)Element)?.SendReleased(); diff --git a/Xamarin.Forms.Platform.WinRT/DatePickerRenderer.cs b/Xamarin.Forms.Platform.WinRT/DatePickerRenderer.cs index 677563e3..005d30ce 100644 --- a/Xamarin.Forms.Platform.WinRT/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/DatePickerRenderer.cs @@ -70,6 +70,8 @@ namespace Xamarin.Forms.Platform.WinRT UpdateTextColor(); } + protected override bool PreventGestureBubbling { get; set; } = true; + void OnControlDateChanged(object sender, DatePickerValueChangedEventArgs e) { Element.Date = e.NewDate.Date; diff --git a/Xamarin.Forms.Platform.WinRT/SliderRenderer.cs b/Xamarin.Forms.Platform.WinRT/SliderRenderer.cs index 0fff1496..7bef3e93 100644 --- a/Xamarin.Forms.Platform.WinRT/SliderRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/SliderRenderer.cs @@ -71,6 +71,8 @@ namespace Xamarin.Forms.Platform.WinRT } } + protected override bool PreventGestureBubbling { get; set; } = true; + void OnNativeValueChanged(object sender, RangeBaseValueChangedEventArgs e) { ((IElementController)Element).SetValueFromRenderer(Slider.ValueProperty, e.NewValue); diff --git a/Xamarin.Forms.Platform.WinRT/StepperRenderer.cs b/Xamarin.Forms.Platform.WinRT/StepperRenderer.cs index 4f09b126..796ef562 100644 --- a/Xamarin.Forms.Platform.WinRT/StepperRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/StepperRenderer.cs @@ -52,6 +52,8 @@ namespace Xamarin.Forms.Platform.WinRT Control.ButtonBackgroundColor = Element.BackgroundColor; } + protected override bool PreventGestureBubbling { get; set; } = true; + void OnControlValue(object sender, EventArgs e) { Element.SetValueCore(Stepper.ValueProperty, Control.Value); diff --git a/Xamarin.Forms.Platform.WinRT/SwitchRenderer.cs b/Xamarin.Forms.Platform.WinRT/SwitchRenderer.cs index ebc08ad6..05de07a4 100644 --- a/Xamarin.Forms.Platform.WinRT/SwitchRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/SwitchRenderer.cs @@ -42,6 +42,8 @@ namespace Xamarin.Forms.Platform.WinRT } } + protected override bool PreventGestureBubbling { get; set; } = true; + void OnNativeToggled(object sender, RoutedEventArgs routedEventArgs) { ((IElementController)Element).SetValueFromRenderer(Switch.IsToggledProperty, Control.IsOn); diff --git a/Xamarin.Forms.Platform.WinRT/TimePickerRenderer.cs b/Xamarin.Forms.Platform.WinRT/TimePickerRenderer.cs index 59ce8fcd..336edd30 100644 --- a/Xamarin.Forms.Platform.WinRT/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/TimePickerRenderer.cs @@ -65,6 +65,8 @@ namespace Xamarin.Forms.Platform.WinRT UpdateTextColor(); } + protected override bool PreventGestureBubbling { get; set; } = true; + void OnControlTimeChanged(object sender, TimePickerValueChangedEventArgs e) { Element.Time = e.NewTime; diff --git a/Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs b/Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs index a1cc0e44..778f464e 100644 --- a/Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/VisualElementRenderer.cs @@ -38,6 +38,8 @@ namespace Xamarin.Forms.Platform.WinRT protected bool ArrangeNativeChildren { get; set; } + protected virtual bool PreventGestureBubbling { get; set; } = false; + IElementController ElementController => Element as IElementController; protected VisualElementTracker<TElement, TNativeElement> Tracker @@ -549,6 +551,7 @@ namespace Xamarin.Forms.Platform.WinRT if (_tracker == null) return; + _tracker.PreventGestureBubbling = PreventGestureBubbling; _tracker.Control = Control; _tracker.Element = Element; _tracker.Container = ContainerElement; diff --git a/Xamarin.Forms.Platform.WinRT/VisualElementTracker.cs b/Xamarin.Forms.Platform.WinRT/VisualElementTracker.cs index a29d61ad..06c72b9a 100644 --- a/Xamarin.Forms.Platform.WinRT/VisualElementTracker.cs +++ b/Xamarin.Forms.Platform.WinRT/VisualElementTracker.cs @@ -67,6 +67,8 @@ namespace Xamarin.Forms.Platform.WinRT } } + public bool PreventGestureBubbling { get; set; } + public TNativeElement Control { get { return _control; } @@ -75,8 +77,19 @@ namespace Xamarin.Forms.Platform.WinRT if (_control == value) return; + if (_control != null) + { + _control.Tapped -= HandleTapped; + _control.DoubleTapped -= HandleDoubleTapped; + } + _control = value; UpdateNativeControl(); + + if (PreventGestureBubbling) + { + UpdatingGestureRecognizers(); + } } } @@ -163,6 +176,12 @@ namespace Xamarin.Forms.Platform.WinRT } } + if (_control != null) + { + _control.Tapped -= HandleTapped; + _control.DoubleTapped -= HandleDoubleTapped; + } + Control = null; Element = null; Container = null; @@ -502,11 +521,29 @@ namespace Xamarin.Forms.Platform.WinRT _container.PointerReleased -= OnPointerReleased; _container.PointerCanceled -= OnPointerCanceled; - if (gestures.GetGesturesFor<TapGestureRecognizer>(g => g.NumberOfTapsRequired == 1).GetEnumerator().MoveNext()) + if (gestures.GetGesturesFor<TapGestureRecognizer>(g => g.NumberOfTapsRequired == 1).Any()) + { _container.Tapped += OnTap; + } + else + { + if (_control != null && PreventGestureBubbling) + { + _control.Tapped += HandleTapped; + } + } - if (gestures.GetGesturesFor<TapGestureRecognizer>(g => g.NumberOfTapsRequired == 2).GetEnumerator().MoveNext()) + if (gestures.GetGesturesFor<TapGestureRecognizer>(g => g.NumberOfTapsRequired == 2).Any()) + { _container.DoubleTapped += OnDoubleTap; + } + else + { + if (_control != null && PreventGestureBubbling) + { + _control.DoubleTapped += HandleDoubleTapped; + } + } bool hasPinchGesture = gestures.GetGesturesFor<PinchGestureRecognizer>().GetEnumerator().MoveNext(); bool hasPanGesture = gestures.GetGesturesFor<PanGestureRecognizer>().GetEnumerator().MoveNext(); @@ -532,5 +569,15 @@ namespace Xamarin.Forms.Platform.WinRT _container.PointerReleased += OnPointerReleased; _container.PointerCanceled += OnPointerCanceled; } + + void HandleTapped(object sender, TappedRoutedEventArgs tappedRoutedEventArgs) + { + tappedRoutedEventArgs.Handled = true; + } + + void HandleDoubleTapped(object sender, DoubleTappedRoutedEventArgs doubleTappedRoutedEventArgs) + { + doubleTappedRoutedEventArgs.Handled = true; + } } }
\ No newline at end of file |