ListBox支持触摸滑动,而ScrollViewer默认不支持。需要设置PanningMode属性,如果不设置PanningMode,如何自定义触摸滑动?

ScrollViewer如需要添加上下/左右触摸移动,需要在Touch事件中处理。

处理如下:封装成一个用户控件

  1. TouchDown事件中记录起始点,并添加对TouchMove事件的监听
  2. TouchUp事件中注销TouchMove事件的监听
  3. 在TouchMove事件中,处理移动的偏移量。起始位置减去偏移量,即为当前滚动条的位置。

注:ScrollViewer滚动到指定位置(指定位置=起始位置-移动的偏移量,滚动方向和手势方向相反)

     /// <summary>
/// 可触摸滚动的ScrollViewer控件
/// </summary>
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);
}
}

Demo下载

WPF 可触摸移动的ScrollViewer控件的更多相关文章

  1. Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用

    一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...

  2. WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 菜单M ...

  3. WPF自定义控件与样式(10)-进度控件ProcessBar自定义样

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: Pro ...

  4. WPF自定义控件(三)の扩展控件

    扩展控件,顾名思义就是对已有的控件进行扩展,一般继承于已有的原生控件,不排除继承于自定义的控件,不过这样做意义不大,因为既然都自定义了,为什么不一步到位呢,有些不同的需求也可以通过此来完成,不过类似于 ...

  5. WPf 带滚动条WrapPanel 自动换行 和控件右键菜单

    原文:WPf 带滚动条WrapPanel 自动换行 和控件右键菜单 技能点包括 WPf 样式的引用 数据的验证和绑定 比较适合初学者 前台: <Window.Resources> < ...

  6. 【WPF学习】第二十章 内容控件

    内容控件(content control)是更特殊的控件类型,它们可包含并显示一块内容.从技术角度看,内容控件时可以包含单个嵌套元素的控件.与布局容器不同的是,内容控件只能包含一个子元素,而布局容器主 ...

  7. WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用

    一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...

  8. WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案

    首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼 ...

  9. WPF笔记(1.9 样式和控件模板)——Hello,WPF!

    原文:WPF笔记(1.9 样式和控件模板)--Hello,WPF! 资源的另一个用途是样式设置: <Window >  <Window.Resources>    <St ...

随机推荐

  1. Android Studio的构建系统:Gradle

    原文作者:youxiachai <用Gradle 构建你的android程序> 前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android st ...

  2. Java_Object

    说一下java中的Object类. 1.Object: Object是java类库中的一个特殊类,也是所有类的父类. Object类定义了一些有用的方法,由于是根类,这些方法在其他类中都存在,一般是进 ...

  3. laravel 目录权限

    chown -R www:www /data/wwwroot   #变更目录所有者并向下传递 find /data/wwwroot/ -type d -exec chmod 755 {} \;   # ...

  4. 电子科技大学实验中学PK赛(二)比赛题解

    比赛地址:http://qscoj.cn/contest/27/ A题 FIFA强化 分析:这个题目要求说的比较明显,用几个if判断一下就好了.不要一判断完就输出,最好用一个ans储存下答案.输出答案 ...

  5. JS基础整理

    使用JS的三种方式 1.直接在html标签中,使用事件属性,调用js代码 <button onclick="alert('弹框')">弹框!</button> ...

  6. Ansible配置免密登陆

    0x01:  把远程服务器的公钥来获取到本地 #ssh-keyscan ip1 ip2 ip3 ip4 >> /root/.ssh/known_hosts 完成后,/root/.ssh/k ...

  7. 高级Java面试总结2

    1. JVM结构原理.GC工作机制详解 答:具体参照:JVM结构.GC工作机制详解     ,说到GC,记住两点:1.GC是负责回收所有无任何引用对象的内存空间. 注意:垃圾回收回收的是无任何引用的对 ...

  8. 【计算机篇】Office 2016 for Mac 安装和破解教程

    免责声明 请亲们支持正版.这教程旨在分享,供参考. 为啥写这篇文章 对于大多数使用 Mac 的用户而言,虽然有苹果自家的办公软件,但功能少,用起来不舒服.而 Offer 2016 版的需要登录激活购买 ...

  9. JAVA基础—线程池

    推荐文章java多线程基础 线程池概述 为什么要使用线程池 1.服务器创建和销毁工作线程的开销很大 2.如果频繁的创建和销毁线程会导致频繁的切换线程,因为一个线程被销毁后,必然要把CPU转让给另一个已 ...

  10. [Swift]LeetCode349. 两个数组的交集 | Intersection of Two Arrays

    Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...