How to disable ScrollViewer in ListBox?
You can remove the ScrollViewer
from a ListBox
by changing its control template to something much simpler:
<ListBox>
<ListBox.Template>
<ControlTemplate>
<ItemsPresenter />
</ControlTemplate>
</ListBox.Template>
...
</ListBox>
However, I question the value of nesting ListBoxes. Remember that each ListBox
is a Selector and has a concept of which item is "selected". Does it really make sense to have a selected item inside a selected item, inside a selected item?
I would suggest changing the "inner" ListBoxes
to simple ItemsControls
so that the nested lists can't have selected items. That would make for a much simpler user experience. You may still need to retemplate the inner ItemsControls
in the same way to remove the scrollbars, but at least the user won't get confused about which item is "selected".
You can disable stealing scroll events by catching scroll event in XAML:
<ListBox PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
and re-publishing it in Code behind:
private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
if (sender is ListBox && !e.Handled)
{
e.Handled = true;
var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
eventArg.RoutedEvent = UIElement.MouseWheelEvent;
eventArg.Source = sender;
var parent = ((Control)sender).Parent as UIElement;
parent.RaiseEvent(eventArg);
}
}
The solution is exactly for ListBox, it helped me with ListView.
I found this solution here:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/3a3bb6b0-e088-494d-8ef2-60814415fd89/swallowing-mouse-scroll?forum=wpf