Windows 7 多点触控应用程序开发(第 II 部分)






4.43/5 (3投票s)
Windows 7 多点触控应用程序开发。
在我的上一篇博文中 Windows 7 多点触控应用程序开发(第一部分),我描述了如何在 Windows 7 中处理多点触控图像操作,这提供了一个关于多点触控开发的基础概念。该代码使用了多点触控操作作用于整个屏幕。如果屏幕上有多个图像,这将为所有图像触发事件。
在这篇文章中,我将向您展示如何为所有图像单独管理多点触控事件。请在此处查看一个这样的图像操作演示 这里。
为此,我们需要为屏幕上的每个手指分配一个唯一的触控 ID。只要手指接触屏幕,与该手指关联的触控 ID 将保持相同。如果用户释放手指,系统将释放触控 ID,并在下次触摸时自动重新分配。那么,我们如何获取触控 ID?您可以从 StylusEventArgs
中获取它(即 args.StylusDevice.Id
)。笔式设备将自动为每次触摸生成此 ID;您只需要将其分配给相应的指尖触摸即可。
首先,我们将创建一个用户控件,该控件将包含单个图像和其 RenderTransform
的 XAML 代码。这与我们在上一篇文章中在 Window
内部所做的事情相同,但在这里,它将在用户控件(Picture
类)内部。创建一个 DependencyProperty
以动态分配 ImageLocation
。
<UserControl x:Class="Windows7MultitouchDemo.Picture"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Image Source="{Binding Path=ImageLocation}" Stretch="Fill" Width="Auto"
Height="Auto" RenderTransformOrigin="0.5, 0.5">
<Image.RenderTransform>
<TransformGroup>
<RotateTransform x:Name="trRotate"/>
<ScaleTransform x:Name="trScale"/>
<TranslateTransform x:Name="trTranslate"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
</UserControl>
为了同时跟踪上述“Picture
”用户控件的多点触控,您可以使用 Windows 7 培训工具包中的 PictureTracker
类。您可以从 Microsoft 网站 下载它。它看起来像这样
/// <summary>
/// Track a single picture
/// </summary>
public class PictureTracker
{
private Point _prevLocation;
public Picture Picture { get; set; }
public void ProcessDown(Point location)
{
_prevLocation = location;
}
public void ProcessMove(Point location)
{
Picture.X += location.X - _prevLocation.X;
Picture.Y += location.Y - _prevLocation.Y;
_prevLocation = location;
}
public void ProcessUp(Point location)
{
//Do Nothing, We might have another touch-id that is
//still down
}
}
现在,我们需要存储与 PictureTracker
类关联的所有活动触控 ID。因此,我们将使用一个 Dictionary
。我们将再次使用 Windows 7 培训工具包中的 PictureTrackerManager
类。
private readonly Dictionary<int, PictureTracker> _pictureTrackerMap;
在您的 Window1.xaml.cs 中创建一个 PictureTrackerManager
类实例,并将笔式事件注册到 PictureTrackerManager
事件。因此,现在,当 Picture
上发生触摸时,PictureTrackerManager
将首先找到与相应实例关联的触控 ID,并引发事件以处理该 ID。
//Register for stylus (touch) events
StylusDown += _pictureTrackerManager.ProcessDown;
StylusUp += _pictureTrackerManager.ProcessUp;
StylusMove += _pictureTrackerManager.ProcessMove;