С# WPF ListView, как прокручивать нажатие определенной кнопки

Я внедряю горизонтальную прокрутку в свой ListView, она работает, но мне нужно прокручивать по горизонтали колесиком мыши.

Я зашел так далеко, что знаю, как определить, прокручивалось ли колесо мыши вверх/вниз, но мне просто нужна команда, которая активирует прокрутку влево/вправо.

 private void UIElement_OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            ListView listView= (ListView)sender;
         
            if (e.Delta < 0)
            {
                // Scrolls right, I need here to activate event that will scroll right,
                // something like listView.ScrollRightByOneItem()
            }
            else
            {
               // Scrolls left, I need here to activate event that will scroll left,
               // something like listView.ScrollLeftByOneItem()
            }
            e.Handled = true;
        }

XAML

  <Grid>
        <ListView
            ItemsSource = "{Binding Path=NotDeletedDevices}"
            MouseDoubleClick = "ListView_MouseDoubleClick"
     PreviewMouseLeftButtonDown = "ListView_PreviewMouseLeftButtonDown"
            PreviewMouseMove = "ListView_PreviewMouseMove"
            SelectionMode = "Single"
            PreviewMouseWheel = "UIElement_OnPreviewMouseWheel"
            TouchDown = "ListView_PreviewTouchDown"
            TouchMove = "ListView_PreviewTouchMove">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation = "Horizontal" />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
        </ListView>
  </Grid>

Есть ли какое-либо событие, которое позволит мне прокрутить вправо или влево на 1 элемент?

Мне нужна команда/событие, которое позволит мне прокручивать вправо/влево в файле .xaml.cs

не могли бы вы показать свой файл xaml?

Frenchy 20.04.2023 12:25

важно знать, где определена ваша полоса прокрутки над списком внутри списка...?

Frenchy 20.04.2023 13:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я определил имя для Listview lview (я думаю, нет необходимости определять Scrollviewer, это автоматически Auto я думаю)

    <ListView x:Name = "lview" Grid.Column = "0" Width = "100" Height = "100"
              ScrollViewer.HorizontalScrollBarVisibility = "Auto" 
              ScrollViewer.VerticalScrollBarVisibility = "Auto" 
              PreviewMouseWheel = "ListViewer_PreviewMouseWheel"/>

Поскольку полоса прокрутки принадлежит Listviewer, вам нужно найти ее экземпляр, поэтому я определяю метод FindScrollViewer:

    private ScrollViewer FindScrollViewer(DependencyObject d)
    {
        if (d is ScrollViewer)
            return d as ScrollViewer;

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(d); i++)
        {
            var sw = FindScrollViewer(VisualTreeHelper.GetChild(d, i));
            if (sw != null) return sw;
        }
        return null;
    }

    private void ListViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
    {
        //find the scrollViewer instance of the control
        var scrollViewer = FindScrollViewer(lview);

        //get the horizontal value
        var h = scrollViewer.HorizontalOffset;
        // check the delta of wheel mouse >0 or <0
        var d = e.Delta;
        var nv = 0d;
        // are you at the beginning or end the scrolling
        if (d < 0)
        {
            nv = d + h < 0 ? 0 : d + h;
        }
        else
        {
            nv = d + h > scrollViewer.ScrollableWidth ? scrollViewer.ScrollableWidth : d + h;
        }
        // to block the vertical move
        scrollViewer.ScrollToVerticalOffset(0);
        //set the new horizontal position
        scrollViewer.ScrollToHorizontalOffset(nv);
    }

я просто показываю, как заблокировать вертикальное перемещение, когда вы хотите переместить полосу прокрутки по горизонтали.

вы можете выбрать клавиатуру (например) для переключения между горизонтальным/вертикальным

Вауууу, спасибо. Единственный хороший ответ и такой простой в реализации. Я часами пытался заставить его работать, но ничего. Высоко ценится француз! <3

Walde 20.04.2023 14:44

@Walde нет проблем, рад помочь вам ... поэтому, чтобы закрыть вопрос, не забудьте проголосовать / подтвердить ответ ...

Frenchy 20.04.2023 14:52

@Frenchy Вам не кажется, что дельта должна быть разделена каким-то делителем? Один шаг колеса дает 120, и это было бы слишком быстро. Я реализовал эту функцию в своем ответе на предыдущий пост OP. stackoverflow.com/a/76020121/3137337

emoacht 20.04.2023 21:45

да, конечно, вы можете оценить скорость прокрутки. Некоторые мыши (например, моя) могут изменить это значение с помощью специального переключателя на мыши.

Frenchy 20.04.2023 21:49

Другие вопросы по теме