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; } ///