using System.Reactive.Disposables; using Avalonia.Controls; using Avalonia.Data; using Avalonia.Input; namespace Avalonia.Xaml.Interactions.Custom; /// /// /// public class BindPointerOverBehavior : DisposingBehavior { /// /// /// public static readonly StyledProperty IsPointerOverProperty = AvaloniaProperty.Register(nameof(IsPointerOver), defaultBindingMode: BindingMode.TwoWay); /// /// /// public bool IsPointerOver { get => GetValue(IsPointerOverProperty); set => SetValue(IsPointerOverProperty, value); } /// /// /// /// protected override void OnAttached(CompositeDisposable disposables) { if (AssociatedObject is null) { return; } var control = AssociatedObject; control.PropertyChanged += AssociatedObjectOnPropertyChanged; disposables.Add(Disposable.Create(() => control.PropertyChanged -= AssociatedObjectOnPropertyChanged)); disposables.Add(Disposable.Create(() => IsPointerOver = false)); return; void AssociatedObjectOnPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e) { if (e.Property == InputElement.IsPointerOverProperty) { IsPointerOver = e.NewValue is true; } } } }