在WPF支持触摸
这篇文章是MSDN上的触摸和操纵了轻微的修改,作为一个快速的概述,并为自己的参考WPF支持触摸。
概观
在新的硬件和Windows 7操作系统的API提供应用程序的能力,同时接收来自多个触摸输入。 WPF使应用程序能够检测和响应,在类似的方式来响应其他输入,触摸发生时,通过提高事件,如鼠标或键盘,触摸。
WPF公开两种类型的事件发生时,触摸:触摸事件和操纵事件。 触摸事件提供有关每个手指在触摸屏上,其运动的原始数据。 操作事件解释为输入某些行动。
先决条件
您需要以下组件来开发应用程序响应触摸。
- 微软Visual Studio 2010。
- Windows 7中。
- 设备,如触摸屏,支持Windows触摸。
WPF公开两种类型的事件发生时,触摸:触摸事件和操纵事件。 触摸事件提供有关每个手指在触摸屏上,其运动的原始数据。 操作事件解释为输入某些行动。
术语
触摸讨论时所使用的下列术语。
- 触摸是一个用户输入的类型是由Windows 7的认可。 通常情况下,开始把手指在触摸屏触摸。 请注意,如常见的是笔记本电脑上的触摸板设备不支持触摸,如果设备只是将手指的位置和移动鼠标输入。
- 多点触控的触摸,从多个点同时发生。 Windows 7和WPF支持多点触控。 每当触摸WPF文档中讨论的概念适用于多点触控。
- 解释被应用到一个对象作为一个肢体动作,触摸时,会出现一个操作。 在WPF中,操纵事件的解释作为一个翻译,扩建,或旋转操作的输入。
- 一个触摸设备,产生如一根手指在触摸屏上触摸输入设备。
响应触摸控件
以下控件可以通过控制手指拖动滚动视图的内容,如果有滚动。
- 在ScrollViewer的定义的ScrollViewer.PanningMode的附加 属性,使您可以指定是否启用了触摸平移水平,垂直,或两者都不是。 如何快速滚动减慢,当用户抬起手指在触摸屏的ScrollViewer.PanningDeceleration属性指定。 ScrollViewer.PanningRatio附加属性指定滚动的比例失调翻译操纵偏移。
类图
下面的类图中突出的重点班,其成员支持触摸:
- 触摸
- 触摸事件暴露UIElement的的 UIElement3D ,和ContentElement的冒泡事件,并通过触摸 。 FrameReported作为应用级别事件(与Silverlight兼容)。
- 虽然触摸下,移动和向上事件是隧道和冒泡,触摸进入和离开事件冒泡只。
- 触摸设备捕获是通过明确的UIElement 。 CaptureTouch方法。
- 触摸事件是同步的。
- 触摸事件总是解雇,是否被解雇或不操作事件。
- WPF支持多点触控。
- 操纵
- 只冒泡事件,操作事件暴露的UIElement 。
- 只有其IsManipulationEnabled是真正的UIElement的操作事件被解雇。
- 操作事件是同步的。
- WPF支持三种类型的操作:扩展和旋转(包括单指旋转支点),和惯性。
- 触摸设备捕获操纵隐的。
- 静态类操纵包含的方法来获取和更新操纵的事件处理程序的操作参数。 它也包含了操作逻辑,如添加添加和删除造,更先进的使用方法。
- WPF支持多种手势。
- WPF不支持手势,或3D操控。
- ScrollViewer的内置支持操纵和惯性,它是由应用程序进行定制。
触摸
触摸事件
基类的UIElement , UIElement3D , ContentElement的定义,您可以订阅您的应用程序,以便将响应触摸事件。 当您的应用程序解释为操纵对象以外的东西触摸,触摸事件是有用的。 例如,一个应用程序,使用户能够绘制一个或多个手指将认购触摸事件。
所有这三个类定义以下事件,同样的行为,不管定义类。
- 着陆
- TouchMove
- TouchUp
- TouchEnter
- TouchLeave
- PreviewTouchDown
- PreviewTouchMove
- PreviewTouchUp
- GotTouchCapture
- LostTouchCapture
键盘和鼠标事件一样,触摸事件是路由事件。 预览开始的事件是隧道事件和触摸开始的事件是冒泡事件。 当你处理这些事件,你可以得到输入的位置,相对的任何元素,由,调用GetTouchPoint或GetIntermediateTouchPoints方法。
触摸事件的执行路径
理解的触摸事件之间的互动,考虑的情况下,用户一个手指放在一个元素上,元素中移动手指,然后抬起手指从元素。 下面的插图显示冒泡事件(隧道事件为简单起见,省略)执行。
下面的列表描述序列上图中事件。 
TouchEnter事件发生一次,当用户将手指上的元素。
TouchDown事件发生一次。
TouchMove事件发生多次,为用户移动手指内元素。
TouchUp事件发生的时间,当用户抬起手指的元素。
TouchLeave事件发生一次。
当使用两个以上的手指,每个手指事件发生。
操纵和惯性
操作事件
为应用程序使用户能够操纵一个对象的情况下, UIElement类定义操作事件。 触摸事件,只是简单地报告触摸位置的不同,操作事件报告可以解释如何输入。 有三种类型的操作,翻译,扩充和旋转。 下面的列表描述了如何调用三种类型的操作。
手指放在一个对象和移动整个手指在触摸屏上调用一个翻译的操纵。 这通常是移动的对象。
两个手指放在一个对象,并从一个移动的手指紧密联系起来,或相距较远,调用扩展操作。 这通常是调整的对象。
两个手指放在一个对象和调用一个旋转操纵围绕对方旋转的手指。 这通常是旋转的对象。
可以同时出现多个类型的操纵。
当你引起对象的回应来操作,你可以有对象出现有惯性。 这可以使你的对象模拟物理世界。 例如,当你把整个表一本书,如果你努力推进这本书会继续向前后释放。 WPF中可以模拟这种行为,提高用户的手指后,发行对象操作事件。
有关如何创建一个应用程序,使用户可以移动,缩放,旋转对象的信息,请参见演练:创建您的第一次触摸应用程序 。
UIElement的定义下面的操作事件。
默认情况下, 一个 UIElement没有收到这些操作事件。 上接收操作事件的UIElement ,集UIElement.IsManipulationEnabled为true。
操作事件的执行路径
考虑这样一个场景其中一个用户“抛出”的对象。 用户把手指上的对象,整个触摸屏上移动手指的短距离,然后抬起手指,而它正。 这样做的结果是该对象将根据用户的手指,并继续向前后,用户举起手指。
下面的插图显示的操作事件,每个事件的重要信息的执行路径。
操作事件

下面的列表描述序列上图中事件。
当用户手指放在对象的ManipulationStarting事件发生。 除其他事项外,本次活动,让你设置ManipulationContainer的财产。 在随后发生的事件,操纵的立场将是相对的ManipulationContainer 。 事件比其他ManipulationStarting ,这个属性是只读只,所以ManipulationStarting的事件,您可以设置此属性是唯一的一次。
ManipulationStarted事件发生的未来。 此事件的报告操纵的起源。
ManipulationDelta事件发生多次作为用户的手指在触摸屏上移动。 物业的DeltaManipulation ManipulationDeltaEventArgs类报告是否操纵运动,扩建,或翻译解释。 这是您执行大部分操纵对象的工作。
ManipulationInertiaStarting事件发生时,用户的手指失去了与对象接触。 此事件使您可以指定在惯性的操作减速。 这是使您的对象可以模拟不同的物理空间或属性,如果你选择。 例如,假设您的应用程序有两个对象代表物理世界中的项目,一个是比其他重。 你可以使较重的物体减速快于较轻的对象。
ManipulationDelta事件发生多次发生的惯性。 请注意,此事件发生时,当用户的手指在触摸屏,当WPF模拟惯性。 换句话说,, ManipulationDelta前后ManipulationInertiaStarting事件发生的。 ManipulationDeltaEventArgs.IsInertial财产报告是否ManipulationDelta事件发生在惯性,使您可以检查该属性,并执行不同的动作,取决于它的价值。
操纵任何惯性结束时的ManipulationCompleted的事件发生。 也就是说,所有ManipulationDelta事件发生后, ManipulationCompleted事件发生信号操纵完成。
边界反馈
UIElement的还定义ManipulationBoundaryFeedback的的事件。 此事件发生在称为ManipulationDelta事件时ReportBoundaryFeedback方法。 ManipulationBoundaryFeedback事件使应用程序或组件提供视觉反馈,一个对象时,碰到了边界。 例如,Window类的处理的ManipulationBoundaryFeedback的事件,导致窗口遇到稍有移动时,其边缘。
鼠标促销
您可以通过调用取消操纵取消对事件参数以外的任何操纵事件方法ManipulationBoundaryFeedback事件。 当你打电话取消 ,操纵事件不再提出和鼠标事件发生接触。 下表介绍了操作被取消的时间和鼠标发生的事件之间的关系。
取消被称为事件 | 鼠标输入已经发生的事件发生 |
|---|---|
鼠标按下事件。 | |
鼠标按下和鼠标移动事件。 | |
鼠标按下,鼠标移动,鼠标up事件。 |
请注意,如果你打电话取消时,操纵惯性是,该方法返回false,输入不会引发鼠标事件。
触摸和操作事件之间的关系
一个 UIElement可以随时接收到触摸事件。 一个 UIElement,当IsManipulationEnabled财产被设置为true,可以同时接收触摸和操纵事件。 TouchDown事件如果不处理(也就是说, 处理财产是假的),操作逻辑捕捉触摸元素和生成操作事件。 如果处理的属性设置为true,在触地事件,操作逻辑不会产生操作事件。 下面的插图显示触摸事件和操作事件之间的关系。
触摸和操纵事件

以下列表描述了在上图中所示的触摸和操纵事件之间的关系。
当第一次触摸设备生成一个触地得分上事件的UIElement ,操作逻辑调用的的方法CaptureTouch ,产生的GotTouchCapture事件。
当GotTouchCapture时,操纵逻辑调用的Manipulation.AddManipulator的方法,该方法生成ManipulationStarting事件,。
当TouchMove事件发生时,操作逻辑产生ManipulationDelta事件发生前ManipulationInertiaStarting事件。
当最后一次触摸设备上的元素引发TouchUp事件,操纵逻辑产生ManipulationInertiaStarting的事件。
EventArgs类图
下面的类图显示了所有的触摸和操纵EventArgs类及相关类型。








最新评论