C# ScrollViewer与listview滑动冲突

记录一次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,配合上边的滚轮事件,我的问题解决,特此记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值