From a2a74618b2363f33efeb5a433c8dcca4593e9cb5 Mon Sep 17 00:00:00 2001 From: Rachel Kang Date: Mon, 22 Aug 2022 20:03:59 -0400 Subject: [PATCH 01/12] Initial PointerGestureRecognizer code --- .../GestureManager/GestureManager.Windows.cs | 89 +++++++++++++- src/Controls/src/Core/PointerEventArgs.cs | 14 +++ .../src/Core/PointerGestureRecognizer.cs | 113 ++++++++++++++++++ 3 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 src/Controls/src/Core/PointerEventArgs.cs create mode 100644 src/Controls/src/Core/PointerGestureRecognizer.cs diff --git a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs index 0decac4e58a1..ad65f1f83b19 100644 --- a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs +++ b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs @@ -8,6 +8,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Maui.Controls.Internals; using Microsoft.Maui.Graphics; +using Microsoft.UI.Input; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media.Imaging; @@ -103,6 +104,8 @@ public FrameworkElement? Control { _control.Tapped -= HandleTapped; _control.DoubleTapped -= HandleDoubleTapped; + //_control.PointerEntered -= HandlePointerEventExecuted; + //_control.PointerExited -= HandlePointerEventExecuted; } _control = value; @@ -318,6 +321,9 @@ void ClearContainerEventHandlers() _container.PointerExited -= OnPointerExited; _container.PointerReleased -= OnPointerReleased; _container.PointerCanceled -= OnPointerCanceled; + _container.PointerEntered -= OnPgrPointerEntered; + _container.PointerExited -= OnPgrPointerExited; + _container.PointerMoved -= OnPgrPointerMoved; } } @@ -348,6 +354,8 @@ protected virtual void Dispose(bool disposing) { _control.Tapped -= HandleTapped; _control.DoubleTapped -= HandleDoubleTapped; + //_control.PointerEntered -= HandlePointerEventExecuted; + //_control.PointerExited -= HandlePointerEventExecuted; } Control = null; @@ -481,7 +489,82 @@ void OnPointerReleased(object sender, PointerRoutedEventArgs e) PanComplete(true); } - void OnTap(object sender, RoutedEventArgs e) + void OnPgrPointerEntered(object sender, PointerRoutedEventArgs e) + { + var view = Element as View; + if (view == null) + return; + + var pointerPoint = e.GetCurrentPoint(Control); + var children = (view as IGestureController)?.GetChildElements(new Point(pointerPoint.Position.X, pointerPoint.Position.Y)); + + if (children != null) + foreach (var recognizer in children.GetChildGesturesFor()) + { + recognizer.SendPointerEntered(view); + } + + if (e.Handled) + return; + + IEnumerable pointerGestures = view.GestureRecognizers.GetGesturesFor(); + foreach (var recognizer in pointerGestures) + { + recognizer.SendPointerEntered(view); + } + } + + void OnPgrPointerExited(object sender, PointerRoutedEventArgs e) + { + var view = Element as View; + if (view == null) + return; + + var pointerPoint = e.GetCurrentPoint(Control); + var children = (view as IGestureController)?.GetChildElements(new Point(pointerPoint.Position.X, pointerPoint.Position.Y)); + + if (children != null) + foreach (var recognizer in children.GetChildGesturesFor()) + { + recognizer.SendPointerExited(view); + } + + if (e.Handled) + return; + + IEnumerable pointerGestures = view.GestureRecognizers.GetGesturesFor(); + foreach (var recognizer in pointerGestures) + { + recognizer.SendPointerExited(view); + } + } + + void OnPgrPointerMoved(object sender, PointerRoutedEventArgs e) + { + var view = Element as View; + if (view == null) + return; + + var pointerPoint = e.GetCurrentPoint(Control); + var children = (view as IGestureController)?.GetChildElements(new Point(pointerPoint.Position.X, pointerPoint.Position.Y)); + + if (children != null) + foreach (var recognizer in children.GetChildGesturesFor()) + { + recognizer.SendPointerMoved(view); + } + + if (e.Handled) + return; + + IEnumerable pointerGestures = view.GestureRecognizers.GetGesturesFor(); + foreach (var recognizer in pointerGestures) + { + recognizer.SendPointerMoved(view); + } + } + + void OnTap(object sender, TappedRoutedEventArgs e) { var view = Element as View; if (view == null) @@ -679,6 +762,10 @@ void UpdatingGestureRecognizers() } } + _container.PointerEntered += OnPgrPointerEntered; + _container.PointerExited += OnPgrPointerExited; + _container.PointerMoved += OnPgrPointerMoved; + bool hasSwipeGesture = gestures.GetGesturesFor().GetEnumerator().MoveNext(); bool hasPinchGesture = gestures.GetGesturesFor().GetEnumerator().MoveNext(); bool hasPanGesture = gestures.GetGesturesFor().GetEnumerator().MoveNext(); diff --git a/src/Controls/src/Core/PointerEventArgs.cs b/src/Controls/src/Core/PointerEventArgs.cs new file mode 100644 index 000000000000..d4d3d6457212 --- /dev/null +++ b/src/Controls/src/Core/PointerEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace Microsoft.Maui.Controls +{ + /// + /// Event arguments used for PointerGestureRecognizer. + /// + public class PointerEventArgs : EventArgs + { + public PointerEventArgs() + { + } + } +} \ No newline at end of file diff --git a/src/Controls/src/Core/PointerGestureRecognizer.cs b/src/Controls/src/Core/PointerGestureRecognizer.cs new file mode 100644 index 000000000000..bafcc3403288 --- /dev/null +++ b/src/Controls/src/Core/PointerGestureRecognizer.cs @@ -0,0 +1,113 @@ +using System; +using System.ComponentModel; +using System.Windows.Input; + +namespace Microsoft.Maui.Controls +{ + /// + /// Provides pointer gesture recognition and events. + /// + public sealed class PointerGestureRecognizer : GestureRecognizer + { + public static readonly BindableProperty PointerEnteredCommandProperty = BindableProperty.Create(nameof(PointerEnteredCommand), typeof(ICommand), typeof(PointerGestureRecognizer), null); + + public static readonly BindableProperty PointerEnteredCommandParameterProperty = BindableProperty.Create(nameof(PointerEnteredCommandParameter), typeof(object), typeof(PointerGestureRecognizer), null); + + public static readonly BindableProperty PointerExitedCommandProperty = BindableProperty.Create(nameof(PointerExitedCommand), typeof(ICommand), typeof(PointerGestureRecognizer), null); + + public static readonly BindableProperty PointerExitedCommandParameterProperty = BindableProperty.Create(nameof(PointerExitedCommandParameter), typeof(object), typeof(PointerGestureRecognizer), null); + + public static readonly BindableProperty PointerMovedCommandProperty = BindableProperty.Create(nameof(PointerMovedCommand), typeof(ICommand), typeof(PointerGestureRecognizer), null); + + public static readonly BindableProperty PointerMovedCommandParameterProperty = BindableProperty.Create(nameof(PointerMovedCommandParameter), typeof(object), typeof(PointerGestureRecognizer), null); + + public PointerGestureRecognizer() + { + } + + //public ICommand Command + //{ + // get { return (ICommand)GetValue(CommandProperty); } + // set { SetValue(CommandProperty, value); } + //} + + //public object CommandParameter + //{ + // get { return GetValue(CommandParameterProperty); } + // set { SetValue(CommandParameterProperty, value); } + //} + + public event EventHandler PointerEntered; + public event EventHandler PointerExited; + public event EventHandler PointerMoved; + + PointerEventArgs args = new PointerEventArgs(); + + public ICommand PointerEnteredCommand + { + get { return (ICommand)GetValue(PointerEnteredCommandProperty); } + set { SetValue(PointerEnteredCommandProperty, value); } + } + + public ICommand PointerEnteredCommandParameter + { + get { return (ICommand)GetValue(PointerEnteredCommandParameterProperty); } + set { SetValue(PointerEnteredCommandParameterProperty, value); } + } + public ICommand PointerExitedCommand + { + get { return (ICommand)GetValue(PointerExitedCommandProperty); } + set { SetValue(PointerExitedCommandProperty, value); } + } + public ICommand PointerExitedCommandParameter + { + get { return (ICommand)GetValue(PointerExitedCommandParameterProperty); } + set { SetValue(PointerExitedCommandParameterProperty, value); } + } + + public ICommand PointerMovedCommand + { + get { return (ICommand)GetValue(PointerMovedCommandProperty); } + set { SetValue(PointerMovedCommandProperty, value); } + } + + public ICommand PointerMovedCommandParameter + { + get { return (ICommand)GetValue(PointerMovedCommandParameterProperty); } + set { SetValue(PointerMovedCommandParameterProperty, value); } + } + + internal void SendPointerEntered(View sender) + { + ICommand cmd = PointerEnteredCommand; + if (cmd != null && cmd.CanExecute(PointerEnteredCommandParameter)) + cmd.Execute(PointerEnteredCommandParameter); + + EventHandler handler = PointerEntered; + if (handler != null) + handler?.Invoke(sender, args); + } + + internal void SendPointerExited(View sender) + { + ICommand cmd = PointerExitedCommand; + if (cmd != null && cmd.CanExecute(PointerExitedCommandParameter)) + cmd.Execute(PointerExitedCommandParameter); + + EventHandler handler = PointerExited; + if (handler != null) + handler?.Invoke(sender, args); + } + + internal void SendPointerMoved(View sender) + { + ICommand cmd = PointerMovedCommand; + if (cmd != null && cmd.CanExecute(PointerMovedCommandParameter)) + cmd.Execute(PointerMovedCommandParameter); + + EventHandler handler = PointerMoved; + if (handler != null) + handler?.Invoke(sender, args); + } + } +} \ No newline at end of file From bece5a3deeb1f865d71ef636dc1520ea54c7bae3 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Wed, 24 Aug 2022 10:18:53 -0500 Subject: [PATCH 02/12] Update PointerGestureRecognizer.cs --- src/Controls/src/Core/PointerGestureRecognizer.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Controls/src/Core/PointerGestureRecognizer.cs b/src/Controls/src/Core/PointerGestureRecognizer.cs index bafcc3403288..b9677e840fc6 100644 --- a/src/Controls/src/Core/PointerGestureRecognizer.cs +++ b/src/Controls/src/Core/PointerGestureRecognizer.cs @@ -76,7 +76,12 @@ public ICommand PointerMovedCommandParameter get { return (ICommand)GetValue(PointerMovedCommandParameterProperty); } set { SetValue(PointerMovedCommandParameterProperty, value); } } - + + public Point? GetPosition(Element? relativeTo) + { + throw new NotImplementedException(); + } + internal void SendPointerEntered(View sender) { ICommand cmd = PointerEnteredCommand; @@ -110,4 +115,4 @@ internal void SendPointerMoved(View sender) handler?.Invoke(sender, args); } } -} \ No newline at end of file +} From 457627435dc7b4de37ae2f198869589a605495d7 Mon Sep 17 00:00:00 2001 From: Rachel Kang Date: Wed, 24 Aug 2022 18:38:12 -0400 Subject: [PATCH 03/12] Clean up code and add nullability --- .../GestureManager/GestureManager.Windows.cs | 65 ++++--------------- .../src/Core/PointerGestureRecognizer.cs | 26 +++----- 2 files changed, 19 insertions(+), 72 deletions(-) diff --git a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs index ad65f1f83b19..20889cf11dc5 100644 --- a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs +++ b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs @@ -104,8 +104,6 @@ public FrameworkElement? Control { _control.Tapped -= HandleTapped; _control.DoubleTapped -= HandleDoubleTapped; - //_control.PointerEntered -= HandlePointerEventExecuted; - //_control.PointerExited -= HandlePointerEventExecuted; } _control = value; @@ -354,8 +352,6 @@ protected virtual void Dispose(bool disposing) { _control.Tapped -= HandleTapped; _control.DoubleTapped -= HandleDoubleTapped; - //_control.PointerEntered -= HandlePointerEventExecuted; - //_control.PointerExited -= HandlePointerEventExecuted; } Control = null; @@ -489,57 +485,16 @@ void OnPointerReleased(object sender, PointerRoutedEventArgs e) PanComplete(true); } - void OnPgrPointerEntered(object sender, PointerRoutedEventArgs e) - { - var view = Element as View; - if (view == null) - return; - - var pointerPoint = e.GetCurrentPoint(Control); - var children = (view as IGestureController)?.GetChildElements(new Point(pointerPoint.Position.X, pointerPoint.Position.Y)); - - if (children != null) - foreach (var recognizer in children.GetChildGesturesFor()) - { - recognizer.SendPointerEntered(view); - } - - if (e.Handled) - return; - - IEnumerable pointerGestures = view.GestureRecognizers.GetGesturesFor(); - foreach (var recognizer in pointerGestures) - { - recognizer.SendPointerEntered(view); - } - } + void OnPgrPointerEntered(object sender, PointerRoutedEventArgs e) + => HandlePgrPointerEvent(e, (view, recognizer) => recognizer.SendPointerEntered(view)); void OnPgrPointerExited(object sender, PointerRoutedEventArgs e) - { - var view = Element as View; - if (view == null) - return; - - var pointerPoint = e.GetCurrentPoint(Control); - var children = (view as IGestureController)?.GetChildElements(new Point(pointerPoint.Position.X, pointerPoint.Position.Y)); - - if (children != null) - foreach (var recognizer in children.GetChildGesturesFor()) - { - recognizer.SendPointerExited(view); - } - - if (e.Handled) - return; - - IEnumerable pointerGestures = view.GestureRecognizers.GetGesturesFor(); - foreach (var recognizer in pointerGestures) - { - recognizer.SendPointerExited(view); - } - } + => HandlePgrPointerEvent(e, (view, recognizer) => recognizer.SendPointerExited(view)); void OnPgrPointerMoved(object sender, PointerRoutedEventArgs e) + => HandlePgrPointerEvent(e, (view, recognizer) => recognizer.SendPointerMoved(view)); + + private void HandlePgrPointerEvent(PointerRoutedEventArgs e, Action SendPointerEvent) { var view = Element as View; if (view == null) @@ -549,18 +504,20 @@ void OnPgrPointerMoved(object sender, PointerRoutedEventArgs e) var children = (view as IGestureController)?.GetChildElements(new Point(pointerPoint.Position.X, pointerPoint.Position.Y)); if (children != null) + { foreach (var recognizer in children.GetChildGesturesFor()) { - recognizer.SendPointerMoved(view); + SendPointerEvent.Invoke(view, recognizer); } + } if (e.Handled) return; - IEnumerable pointerGestures = view.GestureRecognizers.GetGesturesFor(); + var pointerGestures = view.GestureRecognizers.GetGesturesFor(); foreach (var recognizer in pointerGestures) { - recognizer.SendPointerMoved(view); + SendPointerEvent.Invoke(view, recognizer); } } diff --git a/src/Controls/src/Core/PointerGestureRecognizer.cs b/src/Controls/src/Core/PointerGestureRecognizer.cs index b9677e840fc6..2ee9f52c2de5 100644 --- a/src/Controls/src/Core/PointerGestureRecognizer.cs +++ b/src/Controls/src/Core/PointerGestureRecognizer.cs @@ -1,5 +1,7 @@ +#nullable enable using System; using System.ComponentModel; +using Microsoft.Maui.Graphics; using System.Windows.Input; namespace Microsoft.Maui.Controls @@ -25,21 +27,9 @@ public PointerGestureRecognizer() { } - //public ICommand Command - //{ - // get { return (ICommand)GetValue(CommandProperty); } - // set { SetValue(CommandProperty, value); } - //} - - //public object CommandParameter - //{ - // get { return GetValue(CommandParameterProperty); } - // set { SetValue(CommandParameterProperty, value); } - //} - - public event EventHandler PointerEntered; - public event EventHandler PointerExited; - public event EventHandler PointerMoved; + public event EventHandler? PointerEntered; + public event EventHandler? PointerExited; + public event EventHandler? PointerMoved; PointerEventArgs args = new PointerEventArgs(); @@ -88,7 +78,7 @@ internal void SendPointerEntered(View sender) if (cmd != null && cmd.CanExecute(PointerEnteredCommandParameter)) cmd.Execute(PointerEnteredCommandParameter); - EventHandler handler = PointerEntered; + EventHandler? handler = PointerEntered; if (handler != null) handler?.Invoke(sender, args); } @@ -99,7 +89,7 @@ internal void SendPointerExited(View sender) if (cmd != null && cmd.CanExecute(PointerExitedCommandParameter)) cmd.Execute(PointerExitedCommandParameter); - EventHandler handler = PointerExited; + EventHandler? handler = PointerExited; if (handler != null) handler?.Invoke(sender, args); } @@ -110,7 +100,7 @@ internal void SendPointerMoved(View sender) if (cmd != null && cmd.CanExecute(PointerMovedCommandParameter)) cmd.Execute(PointerMovedCommandParameter); - EventHandler handler = PointerMoved; + EventHandler? handler = PointerMoved; if (handler != null) handler?.Invoke(sender, args); } From 50fecf4815209a277eba1dd4ba9d547e1aab172d Mon Sep 17 00:00:00 2001 From: Rachel Kang Date: Thu, 25 Aug 2022 13:54:56 -0400 Subject: [PATCH 04/12] Fix bad merge --- .../Core/Platform/GestureManager/GestureManager.Windows.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs index 20889cf11dc5..46a186714bab 100644 --- a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs +++ b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs @@ -521,12 +521,12 @@ private void HandlePgrPointerEvent(PointerRoutedEventArgs e, Action Date: Thu, 25 Aug 2022 13:55:06 -0400 Subject: [PATCH 05/12] Remove test code --- .../GestureManager/GestureManager.Android.cs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Android.cs b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Android.cs index 9daa4ee6015a..9eb396aaecef 100644 --- a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Android.cs +++ b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Android.cs @@ -172,20 +172,6 @@ void SetupGestures() { platformView.Touch += OnPlatformViewTouched; } - - if (View is not Microsoft.Maui.IButton) - { - platformView.KeyPress += PlatformView_KeyPress; - platformView.Click += PlatformView_Click; - } - } - - private void PlatformView_Click(object? sender, EventArgs e) - { - } - - private void PlatformView_KeyPress(object? sender, AView.KeyEventArgs e) - { } void OnPlatformViewTouched(object? sender, AView.TouchEventArgs e) From 467a2fa75194e1662908aa77f169e81fd9c8756b Mon Sep 17 00:00:00 2001 From: Rachel Kang Date: Thu, 25 Aug 2022 13:55:27 -0400 Subject: [PATCH 06/12] Add sample to GestureGallery --- .../Pages/Core/PointerGestureGalleryPage.xaml | 17 ++++++++++++++ .../Core/PointerGestureGalleryPage.xaml.cs | 22 +++++++++++++++++++ .../ViewModels/GesturesViewModel.cs | 2 ++ 3 files changed, 41 insertions(+) create mode 100644 src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml create mode 100644 src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml.cs diff --git a/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml b/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml new file mode 100644 index 000000000000..ed1425d28b56 --- /dev/null +++ b/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml.cs b/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml.cs new file mode 100644 index 000000000000..4ec15be214d1 --- /dev/null +++ b/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml.cs @@ -0,0 +1,22 @@ +using Microsoft.Maui.Controls; + +namespace Maui.Controls.Sample.Pages +{ + public partial class PointerGestureGalleryPage + { + public PointerGestureGalleryPage() + { + InitializeComponent(); + } + + private void HoverBegan(object sender, PointerEventArgs e) + { + hoverLabel.Text = "Thanks for hovering me! You can hover off now"; + } + + private void HoverEnded(object sender, PointerEventArgs e) + { + hoverLabel.Text = "Hover me again!"; + } + } +} \ No newline at end of file diff --git a/src/Controls/samples/Controls.Sample/ViewModels/GesturesViewModel.cs b/src/Controls/samples/Controls.Sample/ViewModels/GesturesViewModel.cs index 27bcf8810835..424a963f2e34 100644 --- a/src/Controls/samples/Controls.Sample/ViewModels/GesturesViewModel.cs +++ b/src/Controls/samples/Controls.Sample/ViewModels/GesturesViewModel.cs @@ -19,6 +19,8 @@ protected override IEnumerable CreateItems() => new[] "Swipe Gesture."), new SectionModel(typeof(TapGestureGalleryPage), "Tap Gesture", "Tap Gesture."), + new SectionModel(typeof(PointerGestureGalleryPage), "Pointer Gesture", + "Pointer Gesture."), }; } } From 28c8e7cd54fbe9fbedf465599f3c385e8d7cb757 Mon Sep 17 00:00:00 2001 From: Rachel Kang Date: Thu, 25 Aug 2022 17:27:29 -0400 Subject: [PATCH 07/12] Copy and refactor GetPosition logic used in TapGesture --- src/Controls/src/Core/PointerEventArgs.cs | 16 +++++++++++++++- .../src/Core/PointerGestureRecognizer.cs | 19 ++++++------------- .../Windows/RoutedEventArgsExtensions.cs | 6 ++++++ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/Controls/src/Core/PointerEventArgs.cs b/src/Controls/src/Core/PointerEventArgs.cs index d4d3d6457212..4eb292c3b6b7 100644 --- a/src/Controls/src/Core/PointerEventArgs.cs +++ b/src/Controls/src/Core/PointerEventArgs.cs @@ -1,14 +1,28 @@ +#nullable enable + +using Microsoft.Maui.Graphics; using System; namespace Microsoft.Maui.Controls { /// - /// Event arguments used for PointerGestureRecognizer. + /// Arguments for PointerGestureRecognizer events. /// public class PointerEventArgs : EventArgs { + + Func? _getPosition; + public PointerEventArgs() { } + + internal PointerEventArgs(Func? getPosition) + { + _getPosition = getPosition; + } + + public virtual Point? GetPosition(Element? relativeTo) => + _getPosition?.Invoke(relativeTo); } } \ No newline at end of file diff --git a/src/Controls/src/Core/PointerGestureRecognizer.cs b/src/Controls/src/Core/PointerGestureRecognizer.cs index 2ee9f52c2de5..d8f6b2bce2df 100644 --- a/src/Controls/src/Core/PointerGestureRecognizer.cs +++ b/src/Controls/src/Core/PointerGestureRecognizer.cs @@ -31,8 +31,6 @@ public PointerGestureRecognizer() public event EventHandler? PointerExited; public event EventHandler? PointerMoved; - PointerEventArgs args = new PointerEventArgs(); - public ICommand PointerEnteredCommand { get { return (ICommand)GetValue(PointerEnteredCommandProperty); } @@ -67,12 +65,7 @@ public ICommand PointerMovedCommandParameter set { SetValue(PointerMovedCommandParameterProperty, value); } } - public Point? GetPosition(Element? relativeTo) - { - throw new NotImplementedException(); - } - - internal void SendPointerEntered(View sender) + internal void SendPointerEntered(View sender, Func? getPosition) { ICommand cmd = PointerEnteredCommand; if (cmd != null && cmd.CanExecute(PointerEnteredCommandParameter)) @@ -80,10 +73,10 @@ internal void SendPointerEntered(View sender) EventHandler? handler = PointerEntered; if (handler != null) - handler?.Invoke(sender, args); + handler?.Invoke(sender, new PointerEventArgs(getPosition)); } - internal void SendPointerExited(View sender) + internal void SendPointerExited(View sender, Func? getPosition) { ICommand cmd = PointerExitedCommand; if (cmd != null && cmd.CanExecute(PointerExitedCommandParameter)) @@ -91,10 +84,10 @@ internal void SendPointerExited(View sender) EventHandler? handler = PointerExited; if (handler != null) - handler?.Invoke(sender, args); + handler?.Invoke(sender, new PointerEventArgs(getPosition)); } - internal void SendPointerMoved(View sender) + internal void SendPointerMoved(View sender, Func? getPosition) { ICommand cmd = PointerMovedCommand; if (cmd != null && cmd.CanExecute(PointerMovedCommandParameter)) @@ -102,7 +95,7 @@ internal void SendPointerMoved(View sender) EventHandler? handler = PointerMoved; if (handler != null) - handler?.Invoke(sender, args); + handler?.Invoke(sender, new PointerEventArgs(getPosition)); } } } diff --git a/src/Core/src/Platform/Windows/RoutedEventArgsExtensions.cs b/src/Core/src/Platform/Windows/RoutedEventArgsExtensions.cs index eec449bf0b5d..7bf6d0877bba 100644 --- a/src/Core/src/Platform/Windows/RoutedEventArgsExtensions.cs +++ b/src/Core/src/Platform/Windows/RoutedEventArgsExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text; +using Microsoft.Maui.Graphics; using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml; using WPoint = Windows.Foundation.Point; @@ -37,6 +38,11 @@ public static void SetHandled(this RoutedEventArgs e, bool value) return t.GetPosition(relativeTo); else if (e is DoubleTappedRoutedEventArgs dt) return dt.GetPosition(relativeTo); + else if (e is PointerRoutedEventArgs p) + { + var point = p.GetCurrentPoint(relativeTo); + return new WPoint(point.Position.X, point.Position.Y); + } return null; } From 1e58d0b9735cf9bf44d424b262e27bcf5d21f717 Mon Sep 17 00:00:00 2001 From: Rachel Kang Date: Thu, 25 Aug 2022 17:27:48 -0400 Subject: [PATCH 08/12] Clean up code and use GetPosition --- .../GestureManager/GestureManager.Windows.cs | 41 ++++++++----------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs index 46a186714bab..ef209f8c7fac 100644 --- a/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs +++ b/src/Controls/src/Core/Platform/GestureManager/GestureManager.Windows.cs @@ -486,13 +486,16 @@ void OnPointerReleased(object sender, PointerRoutedEventArgs e) } void OnPgrPointerEntered(object sender, PointerRoutedEventArgs e) - => HandlePgrPointerEvent(e, (view, recognizer) => recognizer.SendPointerEntered(view)); + => HandlePgrPointerEvent(e, (view, recognizer) + => recognizer.SendPointerEntered(view, (relativeTo) => GetPosition(relativeTo, e))); void OnPgrPointerExited(object sender, PointerRoutedEventArgs e) - => HandlePgrPointerEvent(e, (view, recognizer) => recognizer.SendPointerExited(view)); + => HandlePgrPointerEvent(e, (view, recognizer) + => recognizer.SendPointerExited(view, (relativeTo) => GetPosition(relativeTo, e))); void OnPgrPointerMoved(object sender, PointerRoutedEventArgs e) - => HandlePgrPointerEvent(e, (view, recognizer) => recognizer.SendPointerMoved(view)); + => HandlePgrPointerEvent(e, (view, recognizer) + => recognizer.SendPointerMoved(view, (relativeTo) => GetPosition(relativeTo, e))); private void HandlePgrPointerEvent(PointerRoutedEventArgs e, Action SendPointerEvent) { @@ -500,20 +503,6 @@ private void HandlePgrPointerEvent(PointerRoutedEventArgs e, Action()) - { - SendPointerEvent.Invoke(view, recognizer); - } - } - - if (e.Handled) - return; - var pointerGestures = view.GestureRecognizers.GetGesturesFor(); foreach (var recognizer in pointerGestures) { @@ -521,6 +510,15 @@ private void HandlePgrPointerEvent(PointerRoutedEventArgs e, Action? tapGestures) foreach (var recognizer in tapGestures) { - recognizer.SendTapped(view, (relativeTo) => - { - var result = e.GetPositionRelativeToElement(relativeTo); - if (result == null) - return null; - - return new Point(result.Value.X, result.Value.Y); - }); + recognizer.SendTapped(view, (relativeTo) => GetPosition(relativeTo, e)); e.SetHandled(true); handled = true; From b8d88773678103fd584d2a4d0858c7bb22ca99cd Mon Sep 17 00:00:00 2001 From: Rachel Kang Date: Thu, 25 Aug 2022 17:28:00 -0400 Subject: [PATCH 09/12] Update control gallery sample --- .../Pages/Core/PointerGestureGalleryPage.xaml | 3 ++- .../Pages/Core/PointerGestureGalleryPage.xaml.cs | 8 +++++++- .../samples/Controls.Sample/ViewModels/CoreViewModel.cs | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml b/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml index ed1425d28b56..10304c56196a 100644 --- a/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml +++ b/src/Controls/samples/Controls.Sample/Pages/Core/PointerGestureGalleryPage.xaml @@ -10,8 +10,9 @@ FontSize="24" Text="Hover me!"> - + +