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