记录一次ScrollViewer与listview嵌套滑动冲突解决方法
我的需求是listview自适应不可滑动,外层ScrollViewer可滑动
1.需要先保证ScrollViewer能滑动,里面先不嵌套listveiw,随便写个布局设置超长高度,确保能滑动,如果不能请问度娘
2.嵌套listview后listview部分不能滑动?主要因为listview内部有scrollview,消耗了滑动事件,需要做的就是不让listvie获取滑动事件
private void ListView_PreviewMouseWheel(object sender, MouseWheelEventArgs e) { if (!e.Handled) { // ListView拦截鼠标滚轮事件 e.Handled = true; // 激发一个鼠标滚轮事件,冒泡给外层ListView接收到 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); } }
在listview上加入 PreviewMouseWheel="ListView_PreviewMouseWheel"
//上边只解决了鼠标滚动的冲突,下边解决滑动冲突主要用于触摸屏上下滑动
public class TouchableScrollViewer : ScrollViewer
{
//触摸点的坐标
Point _startPosition;
//滚动条当前位置
double _startVerticalOffset;
double _startHorizontalOffset;
public TouchableScrollViewer()
{
TouchDown += TouchableScrollViewer_TouchDown;
TouchUp += TouchableScrollViewer_TouchUp;
}
private void TouchableScrollViewer_TouchDown(object sender, TouchEventArgs e)
{
//添加触摸移动监听
TouchMove -= TouchableScrollViewer_TouchMove;
TouchMove += TouchableScrollViewer_TouchMove;
//获取ScrollViewer滚动条当前位置
_startVerticalOffset = VerticalOffset;
_startHorizontalOffset = HorizontalOffset;
//获取相对于ScrollViewer的触摸点位置
TouchPoint point = e.GetTouchPoint(this);
_startPosition = point.Position;
}
private void TouchableScrollViewer_TouchUp(object sender, TouchEventArgs e)
{
//注销触摸移动监听
TouchMove -= TouchableScrollViewer_TouchMove;
}
private void TouchableScrollViewer_TouchMove(object sender, TouchEventArgs e)
{
//获取相对于ScrollViewer的触摸点位置
TouchPoint endPoint = e.GetTouchPoint(this);
//计算相对位置
double diffOffsetY = endPoint.Position.Y - _startPosition.Y;
double diffOffsetX = endPoint.Position.X - _startPosition.X;
//ScrollViewer滚动到指定位置(指定位置=起始位置-移动的偏移量,滚动方向和手势方向相反)
ScrollToVerticalOffset(_startVerticalOffset - diffOffsetY);
ScrollToHorizontalOffset(_startHorizontalOffset - diffOffsetX);
}
}
在其他博主文章中找到的自定义scrollviewer,配合上边的滚轮事件,我的问题解决,特此记录