KeyDownTrigger.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System.Reactive.Disposables;
  2. using Avalonia.Input;
  3. using Avalonia.Interactivity;
  4. using Avalonia.Xaml.Interactivity;
  5. namespace Avalonia.Xaml.Interactions.Custom;
  6. /// <summary>
  7. ///
  8. /// </summary>
  9. public class KeyDownTrigger : RoutedEventTriggerBase
  10. {
  11. /// <summary>
  12. ///
  13. /// </summary>
  14. public static readonly StyledProperty<Key> KeyProperty =
  15. AvaloniaProperty.Register<KeyDownTrigger, Key>(nameof(Key));
  16. /// <summary>
  17. ///
  18. /// </summary>
  19. public Key Key
  20. {
  21. get => GetValue(KeyProperty);
  22. set => SetValue(KeyProperty, value);
  23. }
  24. /// <summary>
  25. ///
  26. /// </summary>
  27. public bool MarkAsHandled { get; set; }
  28. /// <summary>
  29. ///
  30. /// </summary>
  31. /// <param name="disposables"></param>
  32. protected override void OnAttached(CompositeDisposable disposables)
  33. {
  34. if (AssociatedObject is InputElement element)
  35. {
  36. var disposable = element.AddDisposableHandler(InputElement.KeyDownEvent, OnKeyDown, EventRoutingStrategy);
  37. disposables.Add(disposable);
  38. }
  39. }
  40. private void OnKeyDown(object? sender, KeyEventArgs e)
  41. {
  42. if (!IsEnabled)
  43. {
  44. return;
  45. }
  46. if (e.Key == Key)
  47. {
  48. e.Handled = MarkAsHandled;
  49. Interaction.ExecuteActions(AssociatedObject, Actions, null);
  50. }
  51. }
  52. }