Как сделать горизонтальный скролл с зажатой мышкой в avalonia ui?

Для создания горизонтального скролла с зажатой мышью в Avalonia UI, вам понадобится несколько шагов.

Первым делом, вы должны создать основной контейнер для содержимого, которое будет прокручиваться. Это может быть панель StackPanel или Grid, в зависимости от вашего случая использования.

Затем вам понадобится добавить элемент ScrollView, который будет обеспечивать прокрутку содержимого внутри вашего контейнера. В ScrollView вам нужно установить свойство Name, чтобы иметь возможность обратиться к нему из кода.

Затем, настройте событие PointerPressed для вашего ScrollView, чтобы отслеживать начало скролла. В этом событии вы можете сохранить начальную позицию мыши, используя свойство PointerPressedEventArgs.GetPosition.

Далее, вам понадобится настроить события PointerMoved и PointerReleased. В PointerMoved вам нужно рассчитать пройденное расстояние по горизонтали с помощью свойства PointerEventArgs.GetPosition и начальной позиции мыши, сохраненной в PointerPressed. Затем можно изменить положение прокрутки, используя свойство ScrollView.Offset.

После того, как указатель мыши покидает пределы ScrollView, отпустите кнопку мыши в событии PointerReleased. В этом событии обнулите сохраненную позицию мыши.

Пример кода для реализации горизонтального скролла с зажатием мыши:

using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Markup.Xaml;

public class MainWindow : Window
{
    private double _startX;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        AvaloniaXamlLoader.Load(this);

        var scrollView = this.FindControl<ScrollView>("ScrollView");

        scrollView.PointerPressed += ScrollView_OnPointerPressed;
        scrollView.PointerMoved += ScrollView_OnPointerMoved;
        scrollView.PointerReleased += ScrollView_OnPointerReleased;
    }

    private void ScrollView_OnPointerPressed(object? sender, PointerPressedEventArgs e)
    {
        _startX = e.GetPosition((IVisual)sender).X;
    }

    private void ScrollView_OnPointerMoved(object? sender, PointerEventArgs e)
    {
        if (e.GetCurrentPoint((IVisual)sender).Properties.IsLeftButtonPressed)
        {
            var scrollView = (ScrollView)sender;
            var currentX = e.GetPosition(scrollView).X;
            var delta = _startX - currentX;

            scrollView.Offset = new Vector(scrollView.Offset.X + delta, 0);
        }
    }

    private void ScrollView_OnPointerReleased(object? sender, PointerReleasedEventArgs e)
    {
        _startX = 0;
    }
}

И наконец, не забудьте добавить элемент ScrollView в XAML разметку вашего окна:

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ScrollView x:Name="ScrollView" Content="Your Content" />
</Window>

Этот код добавит горизонтальный скролл к вашему контенту в Avalonia UI, и вы сможете перемещать его, зажимая кнопку мыши и перемещая указатель.