From 64ab38f3d23b31714e1c1379603f96678eaa2b3a Mon Sep 17 00:00:00 2001 From: Tom Edwards <109803929+TomEdwardsEnscape@users.noreply.github.com> Date: Fri, 20 Jun 2025 11:11:52 +0200 Subject: [PATCH] Added missing class event handler methods (#18837) * Added missing class event handler methods * Moved handling of Holding event in Control to the class method * Exposed Gesture.RightTappedEvent as InputElement.RightTapped and added a class handler This event was already being raised, but you wouldn't know about it unless you looked into Avalonia's internals --- src/Avalonia.Base/Input/InputElement.cs | 59 +++++++++++++++++++++++++ src/Avalonia.Controls/Control.cs | 8 ++-- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Base/Input/InputElement.cs b/src/Avalonia.Base/Input/InputElement.cs index badf2aa6e7..0e0b6eab5a 100644 --- a/src/Avalonia.Base/Input/InputElement.cs +++ b/src/Avalonia.Base/Input/InputElement.cs @@ -199,6 +199,11 @@ namespace Avalonia.Input /// public static readonly RoutedEvent TappedEvent = Gestures.TappedEvent; + /// + /// Defines the event. + /// + public static readonly RoutedEvent RightTappedEvent = Gestures.RightTappedEvent; + /// /// Defines the event. /// @@ -238,6 +243,11 @@ namespace Avalonia.Input PointerCaptureLostEvent.AddClassHandler((x, e) => x.OnPointerCaptureLost(e)); PointerWheelChangedEvent.AddClassHandler((x, e) => x.OnPointerWheelChanged(e)); + TappedEvent.AddClassHandler((x, e) => x.OnTapped(e)); + RightTappedEvent.AddClassHandler((x, e) => x.OnRightTapped(e)); + DoubleTappedEvent.AddClassHandler((x, e) => x.OnDoubleTapped(e)); + HoldingEvent.AddClassHandler((x, e) => x.OnHolding(e)); + // Gesture only handlers PointerMovedEvent.AddClassHandler((x, e) => x.OnGesturePointerMoved(e), handledEventsToo: true); PointerPressedEvent.AddClassHandler((x, e) => x.OnGesturePointerPressed(e), handledEventsToo: true); @@ -399,6 +409,15 @@ namespace Avalonia.Input remove { RemoveHandler(TappedEvent, value); } } + /// + /// Occurs when a right tap gesture occurs on the control. + /// + public event EventHandler? RightTapped + { + add { AddHandler(RightTappedEvent, value); } + remove { RemoveHandler(RightTappedEvent, value); } + } + /// /// Occurs when a hold gesture occurs on the control. /// @@ -746,6 +765,46 @@ namespace Avalonia.Input { } + /// + /// Invoked when an unhandled reaches an element in its + /// route that is derived from this class. Implement this method to add class handling + /// for this event. + /// + /// Data about the event. + protected virtual void OnTapped(TappedEventArgs e) + { + } + + /// + /// Invoked when an unhandled reaches an element in its + /// route that is derived from this class. Implement this method to add class handling + /// for this event. + /// + /// Data about the event. + protected virtual void OnRightTapped(TappedEventArgs e) + { + } + + /// + /// Invoked when an unhandled reaches an element in its + /// route that is derived from this class. Implement this method to add class handling + /// for this event. + /// + /// Data about the event. + protected virtual void OnDoubleTapped(TappedEventArgs e) + { + } + + /// + /// Invoked when an unhandled reaches an element in its + /// route that is derived from this class. Implement this method to add class handling + /// for this event. + /// + /// Data about the event. + protected virtual void OnHolding(HoldingRoutedEventArgs e) + { + } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { base.OnPropertyChanged(change); diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index e27a6c5c38..4f3e76d487 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -386,12 +386,12 @@ namespace Avalonia.Controls InitializeIfNeeded(); ScheduleOnLoadedCore(); - - Holding += OnHoldEvent; } - private void OnHoldEvent(object? sender, HoldingRoutedEventArgs e) + protected override void OnHolding(HoldingRoutedEventArgs e) { + base.OnHolding(e); + if (e.Source == this && !e.Handled && e.HoldingState == HoldingState.Started) { // Trigger ContentRequest when hold has started @@ -408,8 +408,6 @@ namespace Avalonia.Controls base.OnDetachedFromVisualTreeCore(e); OnUnloadedCore(); - - Holding -= OnHoldEvent; } ///