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