This is my XAML code which create a ListView inside a ScrollView. I can simple using a ListView but beside listview, I want to put someother control into ScrollView.
And my ScrollView didn't work anymore. ListView seem swallowing mouse wheel and touch event.
<scrollviewer panningdeceleration="0.003"
panningmode="VerticalOnly"
verticalscrollbarvisibility="Auto"
x:name="scroller">
<stackpanel>
<listview itemcontainerstyle="{StaticResource listBoxItemStyle}"
itemssource="{Binding ContactList, IsAsync=False}"
scrollviewer.horizontalscrollbarvisibility="Disabled"
x:name="lvContact">
..................
</listview>
...............
</stackpanel>
</scrollviewer>
ISSUE 1 Listview swallow mousewheel event so that scroll view does not work.
SOLUTION: Forward scroll event from Listview to its father
<listview itemcontainerstyle="{StaticResource listBoxItemStyle}"
itemssource="{Binding ContactList, IsAsync=False}"
previewmousewheel="lvContact_PreviewMouseWheel"
scrollviewer.horizontalscrollbarvisibility="Disabled"
x:name="lvContact">
..................
</listview>
private void lvContact_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
if (!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);
}
}
ISSUE 2: ScrollView still not work on touch device
SOLUTION: when ScrollView handle TouchDownEvent, set it capture touch device input and release device on TouchUpEvent
<scrollviewer panningdeceleration="0.003"
panningmode="VerticalOnly"
touchdown="scroller_TouchDown"
touchup="scroller_TouchUp"
verticalscrollbarvisibility="Auto"
x:name="scroller">
private void scroller_TouchDown(object sender, System.Windows.Input.TouchEventArgs e)
{
FrameworkElement scrollView = sender as FrameworkElement;
if (scrollView == null)
return;
scrollView.CaptureTouch(e.TouchDevice);
e.Handled = true;
}
private void scroller_TouchUp(object sender, System.Windows.Input.TouchEventArgs e)
{
FrameworkElement scrollView = sender as FrameworkElement;
if (scrollView == null)
return;
scrollView.ReleaseTouchCapture(e.TouchDevice);
e.Handled = true;
}