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());
}
}
}