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