在 Windows 7 上使用 WPF 4.0 进行多点触控机器人控制






4.94/5 (15投票s)
在 Windows 7 上使用多点触控控制乐高 NXT 机器人。
引言
随着 Windows 7 的发布,我们的应用程序现在原生支持多点触控。只要硬件能够识别多个同时触控,Windows 7 就可以处理。此外,.NET 4.0 和 WPF 4.0 现在内置了对多点触控编码的支持。本文将向您展示如何利用这些功能。我编写了一个多点触控机器人控制应用程序来演示新功能。这是使用 Visual Studio 2010 beta 2 和 WPF 4.0 编写的。
背景
当 Visual Studio 2010 beta 2 首次发布时,我立即下载并安装了它。然后我想,有什么新功能是我可以用它来做的呢?当然,多点触控立刻浮现在我脑海中。我对新的多点触控支持感到兴奋。我们才刚刚开始(呵呵)探索使用多点触控的新应用程序界面。我认为像您这样的开发者将创造出许多很酷的新用户体验。
Slider控件
首先,我需要一个滑块控件,所以我创建了一个名为 SliderControl.XAML
的 WPF 用户控件。我给它一个漂亮的圆形边框和一个线性渐变填充。然后,我添加了一个椭圆形作为用户交互的控制旋钮。
TouchDown、TouchUp 和 TouchMove 事件
每次手指最初触碰屏幕时,都会触发 TouchDown
事件。在 TouchEventArgs
中,您将获得一个 TouchDevice
对象,其中包含多点触控硬件分配给当前触控的 ID。您可以在后续代码中使用此 ID 来跟踪触控。但是,还有其他方法可以为您跟踪这一点,方法是捕获触控。
每次抬起手指离开屏幕时,都会触发 TouchUp
事件。您将获得另一个 TouchDevice
对象,以便您可以释放对当前触控的任何捕获。
当您在屏幕上拖动手指时,TouchMove
事件会触发很多次。屏幕上的每次手指移动都会触发一个单独的事件。您无法保证事件到达的顺序。这就是为什么 TouchDevice.ID
很重要的原因。
要检测和捕获触控事件,我们首先需要在 SliderControl
的构造函数中挂钩事件处理程序。您会注意到我们挂钩了用户控件的 TouchDown
和 TouchUp
事件,但挂钩了椭圆形的 TouchMove
事件。这是因为椭圆形最终会捕获 TouchMove
事件并处理它们。
this.TouchDown += new EventHandler<TouchEventArgs>(SliderCtrl_TouchDown);
this.TouchUp += new EventHandler<TouchEventArgs>(SliderCtrl_TouchUp);
this.elSlider.TouchMove += new EventHandler<toucheventargs>(elSlider_TouchMove);
一旦触发了 TouchDown
事件,我们希望确定它是否发生在控制旋钮(在本例中为椭圆形)上。如果返回的 TouchDevice.DirectlyOver
对象是椭圆形,那么只要椭圆形没有已经捕获其他触控,我们就会捕获该触控。
private void SliderCtrl_TouchDown(object sender, TouchEventArgs touchEventArgs)
{
// Capture the TouchDevice if it is over the ellipse
if (touchEventArgs.TouchDevice.DirectlyOver == this.elSlider)
{
if (this.elSlider.TouchesCaptured.Count() == 0)
{
this.elSlider.CaptureTouch(touchEventArgs.TouchDevice);
touchEventArgs.Handled = true;
}
}
}
在 TouchDevice
被椭圆形捕获后,TouchMove
事件处理程序将接收来自该触控的所有移动数据。因此,我们只需获取当前位置,进行任何我们想要的计算,然后等待下一个 TouchMove
事件。我使用位置数据来设置椭圆形的 Top.Property
。我还添加了代码来限制它在屏幕上移动的距离,根据位置计算一个归一化值,并触发一个名为 ValueChanged
的事件。
private void elSlider_TouchMove(object sender, TouchEventArgs touchEventArgs)
{
double position = touchEventArgs.GetTouchPoint(this).Position.Y - 30;
if (position > MIN_VAL && position < MAX_VAL)
{
this.elSlider.SetValue(Canvas.TopProperty, position);
CalcCurrentValue(position);
this.txtVal.Text = string.Format("{0:F2}", this._curValue);
this.OnValueChanged(this, this._emptyArgs);
}
touchEventArgs.Handled = true;
}
当我们将手指从屏幕上抬起后,我们将收到一个 TouchUp
事件。在这里,我们将确定该 TouchDevice
是否被椭圆形捕获。如果是,则释放它,将椭圆形置于滑块的中心,并发送另一个 ValueChanged
事件。
private void SliderCtrl_TouchUp(object sender, TouchEventArgs touchEventArgs)
{
if (touchEventArgs.TouchDevice.Captured == this.elSlider)
{
this.elSlider.ReleaseTouchCapture(touchEventArgs.TouchDevice);
CenterSlider();
touchEventArgs.Handled = true;
this.OnValueChanged(this, this._emptyArgs);
}
}
Using the Code
这个应用程序的整个目的是使用多点触控来控制乐高 NXT 机器人。我想要屏幕上有两个滑块控件,可以同时独立控制每个电机。因此,每个滑块控件都通过触发 ValueChanged
事件进行连接,主应用程序将发送串行命令到 NXT 机器人,根据滑块控件的位置向前或向后移动每个电机。
如果您不想控制机器人,但仍希望为您的应用程序提供多点触控滑块控件,那么很容易将 SliderControl.XAML
用户控件提取出来并将其放入您自己的应用程序中。您可以挂钩 ValueChanged
事件,然后就可以使用了。我在 SliderControl
中添加了一个节流机制,这样它就不会发送过快的值导致 NXT 机器人无法处理。如果您不想要,很容易将其删除。
我已将一段视频上传到 YouTube,展示了该应用程序控制机器人的实际操作。您可以在以下网址找到它:使用 WPF 4.0 的多点触控机器人控制。
Windows 7 中的设备
Windows 7 让连接设备到笔记本电脑变得非常容易。在本例中,我通过蓝牙连接了一个乐高 NXT 模块。这非常简单。首先,打开 NXT 模块并将其设置为可通过蓝牙可见。然后,在 Windows 7 中打开“设备和打印机”。它位于“开始”菜单的“控制面板”下方。
当您输入正确的密码后,应该会在“设备”中看到您的 NXT。NXT 的默认密码是“1234”。
您可以双击 NXT 图标,查看它提供的服务。在本例中,它显示为一个串行端口。该应用程序使用 SerialPort
类与 NXT 机器人进行通信。您可以在乐高 NXT 网站上找到所有文档和直接命令。对于此应用程序,要控制的特定 NXT 的串行端口设置在 App.Config 文件中。只需将 COM 值更改为您的 NXT 使用的值,然后运行应用程序。
结论
本文向您展示了如何使用 Visual Studio 2010 beta 2 和 WPF 4.0 轻松访问多点触控笔记本电脑的多点触控功能。我希望将来,硬件制造商能够推出更多具有同时触控点的笔记本电脑。我相信仍有许多很棒的多点触控 .NET 应用程序等待被编写。我们需要硬件跟上我们的想象力。
将来,我计划为这个应用程序添加更多功能,以获得更多多点触控机器人控制的乐趣。
历史
- 2010 年 2 月 2 日 - 文章和源代码的初始发布。