using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Xaml.Interactivity; namespace Avalonia.Xaml.Interactions.Custom; /// /// /// public class HorizontalScrollViewerBehavior : StyledElementBehavior { /// /// /// public enum ChangeSize { /// /// /// Line, /// /// /// Page } /// /// /// public static readonly StyledProperty RequireShiftKeyProperty = AvaloniaProperty.Register(nameof(RequireShiftKey)); /// /// /// public static readonly StyledProperty ScrollChangeSizeProperty = AvaloniaProperty.Register(nameof(ScrollChangeSize)); /// /// /// public bool RequireShiftKey { get => GetValue(RequireShiftKeyProperty); set => SetValue(RequireShiftKeyProperty, value); } /// /// /// public ChangeSize ScrollChangeSize { get => GetValue(ScrollChangeSizeProperty); set => SetValue(ScrollChangeSizeProperty, value); } /// /// /// protected override void OnAttached() { base.OnAttached(); AssociatedObject!.AddHandler(InputElement.PointerWheelChangedEvent, OnPointerWheelChanged, RoutingStrategies.Tunnel); } /// /// /// protected override void OnDetaching() { base.OnDetaching(); AssociatedObject!.RemoveHandler(InputElement.PointerWheelChangedEvent, OnPointerWheelChanged); } /// /// /// /// /// private void OnPointerWheelChanged(object? sender, PointerWheelEventArgs e) { if (!IsEnabled) { e.Handled = true; return; } if (RequireShiftKey && e.KeyModifiers == KeyModifiers.Shift || !RequireShiftKey) { if (e.Delta.Y < 0) { if (ScrollChangeSize == ChangeSize.Line) { AssociatedObject!.LineRight(); } else { AssociatedObject!.PageRight(); } } else { if (ScrollChangeSize == ChangeSize.Line) { AssociatedObject!.LineLeft(); } else { AssociatedObject!.PageLeft(); } } } } }