ScrollViewer mouse wheel not scrolling
Solution 1
This may help you..
private void ListViewScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
ScrollViewer scv = (ScrollViewer)sender;
scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
e.Handled = true;
}
Solution 2
This would probably be the most comfortable solution:
<ListView.Template>
<ControlTemplate>
<ScrollViewer>
<ItemsPresenter></ItemsPresenter>
</ScrollViewer>
</ControlTemplate>
</ListView.Template>
Solution 3
For me this worked:
<ListView.Template>
<ControlTemplate>
<!-- Empty template to allow ScrollViewer to capture mouse scroll -->
<ItemsPresenter />
</ControlTemplate>
</ListView.Template>
instead of this:
<ListView.Template>
<ControlTemplate>
<ScrollViewer>
<ItemsPresenter></ItemsPresenter>
</ScrollViewer>
</ControlTemplate>
</ListView.Template>
Solution 4
<ScrollViewer Background="Transparent">
If Background
is null, the mouse wheel will not work on ScrollViewer
. You can set the Background
to Transparent
or some other value.
Solution 5
In my case this helped:
<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>
The design was disabling VerticalScrollBarVisibility
attribute in outer scope , i.e. in ScrollViewer
.
sadeniju
Updated on July 05, 2022Comments
-
sadeniju almost 2 years
I am currently working on my first WPF project and trying to make a
ListView
scrollable. At first I thought this could be easily done by simply limiting theListView
's width and height and thus forcing a scrollbar to appear automatically whenever the content exceeds its space. This seemed fine at first but due to the handledPreviewMouseDown
event (which enables dragging the list's items) it doesn't work after selecting an item.Second attempt (using
ScrollViewer
)<ScrollViewer> <ListView ItemsSource="{Binding FileViewModels}" PreviewMouseDown="ListView_MouseMove" Height="450" Width="200"/> </ScrollViewer>
Of course, this resulted in a second scrollbar whenever the list's content became larger than its max height. And dragging the bar still didn't work after selecting an item.
Third (quite foolish) attempt (disabling scrollbar duplicate)
<ScrollViewer> <ListView ItemsSource="{Binding FileViewModels}" PreviewMouseDown="ListView_MouseMove" Height="450" Width="200" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled"/> </ScrollViewer>
This removed the scrollbar duplicate and enabled scrolling via mouse wheel but disabled the scrollbar, so you couldn't move by clicking and dragging it.
Fourth attempt (constant size of the
ScrollViewer
)<ScrollViewer Height="450" Width="200"> <ListView ItemsSource="{Binding FileViewModels}" PreviewMouseDown="ListView_MouseMove"/> </ScrollViewer>
Removed the width/height constraint from the
ListView
and moved it to theScrollViewer
. This enables the scrollbar and removes the duplicate. Unfortunately the mouse wheel doesn't work anymore (dragging the scroll bar works fine).Could somebody please explain to me why the mouse wheel doesn't work anymore and how to fix this?
Edit Maybe I should go back to my first solution.
Obviously, the
ListView
's template already contains aScrollViewer
. The remaining problem would then be that I cannot drag the scrollbar after selecting an item because of the handledPreviewMouseDown
event (scrolling via MouseWheel still works in that case). Should I handle the dragging of items differently (it worked fine for me, before wanting to add a scrollbar)? Or is there a way to detect if the cursor is above the scrollbar (so I could then deselect the item which enables scrolling)? Or are there any other suggestions? -
sadeniju about 11 yearsNice, this works - thank you. But I am still not sure, whether having a ListView inside a ScrollViewer is good style (see edit section above).
-
Johannes Wanzek over 9 yearsBest Solution. Might be possible to aditionally put Itemspresenter into a
Grid
orDockPanel
-
Shalvin Abraham over 8 yearsI am facing a small issue with your solution.. The header is now vanished.. Any suggestions?
-
Dbl over 8 years@ShalvinAbraham what header? Listview has no header i'm aware of?
-
Shalvin Abraham over 8 yearsI am new to WPF, so maybe my misunderstanding.. I am using ListView as : <ListView.View> <GridView> <GridViewColumn> with headers.
-
Shalvin Abraham over 8 yearsI was able to fix the issue by adding <ListView MaxHeight="200" ScrollViewer.CanContentScroll="True" to the list view element. Now it supports mouse wheel, as well as headers
-
Max almost 7 yearsthis works for me only, if the mouse pointer is over the scrollbar, but not if it is over the content
-
edtheprogrammerguy almost 6 yearsI found dividing
e.Delta
by 10 made a finer granularity to the scrolling (less chunky). (Good answer, though!) -
Elyasaf755 about 4 yearsThis should be the accepted answer. It's working & simple. Thank you!
-
Ivanhoe almost 4 yearsAgree. This is the only answer which works for me! Thanks!