ButtonHideFlyoutOnClickBehavior.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using System;
  2. using System.Reactive.Disposables;
  3. using System.Reactive.Linq;
  4. using Avalonia.Controls;
  5. using Avalonia.Controls.Primitives;
  6. using Avalonia.Interactivity;
  7. using Avalonia.VisualTree;
  8. namespace Avalonia.Xaml.Interactions.Custom;
  9. /// <summary>
  10. ///
  11. /// </summary>
  12. public class ButtonHideFlyoutOnClickBehavior : AttachedToVisualTreeBehavior<Button>
  13. {
  14. /// <summary>
  15. ///
  16. /// </summary>
  17. /// <param name="disposables"></param>
  18. protected override void OnAttachedToVisualTree(CompositeDisposable disposables)
  19. {
  20. if (AssociatedObject is null)
  21. {
  22. return;
  23. }
  24. var flyoutPresenter = AssociatedObject.FindAncestorOfType<FlyoutPresenter>();
  25. if (flyoutPresenter?.Parent is not Popup popup)
  26. {
  27. return;
  28. }
  29. var disposable = Observable
  30. .FromEventPattern<RoutedEventArgs>(handler => AssociatedObject.Click += handler, handler => AssociatedObject.Click -= handler)
  31. .Do(_ =>
  32. {
  33. // Execute Command if any before closing. Otherwise, it won't execute because Close will destroy the associated object before Click can execute it.
  34. if (AssociatedObject.Command != null && AssociatedObject.IsEnabled)
  35. {
  36. AssociatedObject.Command.Execute(AssociatedObject.CommandParameter);
  37. }
  38. popup.Close();
  39. })
  40. .Subscribe();
  41. disposables.Add(disposable);
  42. }
  43. }