FocusControlBehavior.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System.Reactive.Disposables;
  2. using Avalonia.Controls;
  3. using Avalonia.Reactive;
  4. using Avalonia.Threading;
  5. namespace Avalonia.Xaml.Interactions.Custom;
  6. /// <summary>
  7. ///
  8. /// </summary>
  9. public class FocusControlBehavior : AttachedToVisualTreeBehavior<Control>
  10. {
  11. /// <summary>
  12. ///
  13. /// </summary>
  14. public static readonly StyledProperty<bool> FocusFlagProperty =
  15. AvaloniaProperty.Register<FocusControlBehavior, bool>(nameof(FocusFlag));
  16. /// <summary>
  17. ///
  18. /// </summary>
  19. public bool FocusFlag
  20. {
  21. get => GetValue(FocusFlagProperty);
  22. set => SetValue(FocusFlagProperty, value);
  23. }
  24. /// <summary>
  25. ///
  26. /// </summary>
  27. /// <param name="disposables"></param>
  28. protected override void OnAttached(CompositeDisposable disposables)
  29. {
  30. base.OnAttached(disposables);
  31. var disposable = this.GetObservable(FocusFlagProperty)
  32. .Subscribe(new AnonymousObserver<bool>(
  33. focusFlag =>
  34. {
  35. if (focusFlag && IsEnabled)
  36. {
  37. Dispatcher.UIThread.Post(() => AssociatedObject?.Focus());
  38. }
  39. }));
  40. disposables.Add(disposable);
  41. }
  42. /// <summary>
  43. ///
  44. /// </summary>
  45. /// <param name="disposable"></param>
  46. protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
  47. {
  48. if (FocusFlag && IsEnabled)
  49. {
  50. Dispatcher.UIThread.Post(() => AssociatedObject?.Focus());
  51. }
  52. }
  53. }