using System.Reactive.Disposables; using Avalonia.Controls; using Avalonia.Reactive; using Avalonia.Threading; namespace Avalonia.Xaml.Interactions.Custom; /// /// /// public class FocusControlBehavior : AttachedToVisualTreeBehavior { /// /// /// public static readonly StyledProperty FocusFlagProperty = AvaloniaProperty.Register(nameof(FocusFlag)); /// /// /// public bool FocusFlag { get => GetValue(FocusFlagProperty); set => SetValue(FocusFlagProperty, value); } /// /// /// /// protected override void OnAttached(CompositeDisposable disposables) { base.OnAttached(disposables); var disposable = this.GetObservable(FocusFlagProperty) .Subscribe(new AnonymousObserver( focusFlag => { if (focusFlag && IsEnabled) { Dispatcher.UIThread.Post(() => AssociatedObject?.Focus()); } })); disposables.Add(disposable); } /// /// /// /// protected override void OnAttachedToVisualTree(CompositeDisposable disposable) { if (FocusFlag && IsEnabled) { Dispatcher.UIThread.Post(() => AssociatedObject?.Focus()); } } }