Колесо мыши ScrollViewer не работает
В настоящее время я работаю над своим первым проектом WPF и пытаюсь прокрутить список.
Сначала я думал, что это можно легко сделать, просто ограничив ширину и высоту списка и, таким образом, заставляя полосу прокрутки появляться автоматически всякий раз, когда содержимое превышает его пространство. Сначала это выглядело отлично, но из-за обработанного PreviewMouseDown-Event (который позволяет перетаскивать элементы списка) он не работает после выбора элемента.
Вторая попытка (с помощью ScrollViewer)
<ScrollViewer>
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"
Height="450" Width="200"/>
</ScrollViewer>
Конечно, это привело к появлению второй полосы прокрутки всякий раз, когда содержимое списка стало больше его максимальной высоты. И перетаскивание панели по-прежнему не работает после выбора элемента.
Третий (довольно глупо) попытка (отключение дублирования прокрутки)
<ScrollViewer>
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"
Height="450" Width="200"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
</ScrollViewer>
Это удалило дубликат полосы прокрутки и включило прокрутку с помощью колеса мыши, но отключила полосу прокрутки, поэтому вы не могли двигаться, щелкнув и перетащив ее.
Четвертая попытка (постоянный размер ScrollViewer)
<ScrollViewer Height="450" Width="200">
<ListView ItemsSource="{Binding FileViewModels}"
PreviewMouseDown="ListView_MouseMove"/>
</ScrollViewer>
Убрано ограничение ширины/высоты из ListView и перенесено в ScrollViewer. Это позволяет использовать полосу прокрутки и удаляет дубликат. К сожалению, колесико мыши больше не работает (перетаскивание полосы прокрутки отлично работает).
Может кто-нибудь, пожалуйста, объясните мне, почему колесо мыши больше не работает и как это исправить?
Edit
Возможно, мне стоит вернуться к моему первому решению.
Очевидно, что в шаблоне ListView уже есть ScrollViewer. Остальная проблема заключалась бы в том, что я не могу перетащить полосу прокрутки после выбора элемента из-за обработанного события PreviewMouseDown (в этом случае все еще работает прокрутка через колесико мыши). Должен ли я обрабатывать перетаскивание элементов по-разному (это сработало для меня, прежде чем вы захотите добавить панель прокрутки)? Или есть способ определить, находится ли курсор над полосой прокрутки (так что я мог бы отменить выбор элемента, который позволяет прокручивать)?
Или есть другие предложения?
Ответы
Ответ 1
Это может помочь вам.
private void ListViewScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
ScrollViewer scv = (ScrollViewer)sender;
scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
e.Handled = true;
}
Ответ 2
Это, вероятно, будет самым удобным решением:
<ListView.Template>
<ControlTemplate>
<ScrollViewer>
<ItemsPresenter></ItemsPresenter>
</ScrollViewer>
</ControlTemplate>
</ListView.Template>
Ответ 3
<ScrollViewer Background="Transparent">
Если Background имеет значение null, колесо мыши не будет работать на ScrollViewer. Вы можете установить Background to Transparent или другое значение.
Ответ 4
в моем случае:
<ScrollViewer ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Auto" >
<DataGrid x:Name="dataGrid" SelectionMode="Single" ItemsSource="{Binding}" SelectedValuePath="{Binding Item}" AutoGenerateColumns="True">
</DataGrid>
</ScrollViewer>
дизайн заключался в отключении атрибута VerticalScrollBarVisibility во внешней области видимости, то есть в ScrollViewer
Ответ 5
Для меня это сработало:
<ListView.Template>
<ControlTemplate>
<!-- Empty template to allow ScrollViewer to capture mouse scroll -->
<ItemsPresenter />
</ControlTemplate>
</ListView.Template>
вместо этого:
<ListView.Template>
<ControlTemplate>
<ScrollViewer>
<ItemsPresenter></ItemsPresenter>
</ScrollViewer>
</ControlTemplate>
</ListView.Template>
Ответ 6
Я хочу добавить некоторые комментарии к решению, предоставленному Rocky. Это работало нормально для меня, но позже мне нужно было использовать его в другом окне для прокрутки Grid. Я столкнулся с проблемой: прокрутка не прокручивается до нижнего конца. Причина была в попытках установить недопустимое значение VerticalOffset. Приведенный ниже код отлично работает для меня (просто нужно изменить обработчик PreviewMouseWheel:
private void UIElement_OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
ScrollViewer scroll = (ScrollViewer)sender;
if (e.Delta < 0)
{
if (scroll.VerticalOffset - e.Delta <= scroll.ExtentHeight - scroll.ViewportHeight)
{
scroll.ScrollToVerticalOffset(scroll.VerticalOffset - e.Delta);
}
else
{
scroll.ScrollToBottom();
}
}
else
{
if (scroll.VerticalOffset + e.Delta > 0)
{
scroll.ScrollToVerticalOffset(scroll.VerticalOffset - e.Delta);
}
else
{
scroll.ScrollToTop();
}
}
e.Handled = true;
}
Ответ 7
попробуйте, работает ли ваша мышь или нет, следуя методу
private void timerRefresh_Tick(object sender, EventArgs e)
{
txtbtnhead.Text=Cursor.Position.ToString();
}