65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (15投票s)

2010年2月3日

CPOL

5分钟阅读

viewsIcon

74959

downloadIcon

2113

在 Windows 7 上使用多点触控控制乐高 NXT 机器人。

MTRobotControl-Source-Code

引言

随着 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 用户控件。我给它一个漂亮的圆形边框和一个线性渐变填充。然后,我添加了一个椭圆形作为用户交互的控制旋钮。

SliderControl.JPG

TouchDown、TouchUp 和 TouchMove 事件

每次手指最初触碰屏幕时,都会触发 TouchDown 事件。在 TouchEventArgs 中,您将获得一个 TouchDevice 对象,其中包含多点触控硬件分配给当前触控的 ID。您可以在后续代码中使用此 ID 来跟踪触控。但是,还有其他方法可以为您跟踪这一点,方法是捕获触控。

每次抬起手指离开屏幕时,都会触发 TouchUp 事件。您将获得另一个 TouchDevice 对象,以便您可以释放对当前触控的任何捕获。

当您在屏幕上拖动手指时,TouchMove 事件会触发很多次。屏幕上的每次手指移动都会触发一个单独的事件。您无法保证事件到达的顺序。这就是为什么 TouchDevice.ID 很重要的原因。

要检测和捕获触控事件,我们首先需要在 SliderControl 的构造函数中挂钩事件处理程序。您会注意到我们挂钩了用户控件的 TouchDownTouchUp 事件,但挂钩了椭圆形的 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 机器人无法处理。如果您不想要,很容易将其删除。

NXT-Robot.JPG

我已将一段视频上传到 YouTube,展示了该应用程序控制机器人的实际操作。您可以在以下网址找到它:使用 WPF 4.0 的多点触控机器人控制

Windows 7 中的设备

Windows 7 让连接设备到笔记本电脑变得非常容易。在本例中,我通过蓝牙连接了一个乐高 NXT 模块。这非常简单。首先,打开 NXT 模块并将其设置为可通过蓝牙可见。然后,在 Windows 7 中打开“设备和打印机”。它位于“开始”菜单的“控制面板”下方。

StartMenuDevices.jpg

当您输入正确的密码后,应该会在“设备”中看到您的 NXT。NXT 的默认密码是“1234”。

DevicesScreen.JPG

您可以双击 NXT 图标,查看它提供的服务。在本例中,它显示为一个串行端口。该应用程序使用 SerialPort 类与 NXT 机器人进行通信。您可以在乐高 NXT 网站上找到所有文档和直接命令。对于此应用程序,要控制的特定 NXT 的串行端口设置在 App.Config 文件中。只需将 COM 值更改为您的 NXT 使用的值,然后运行应用程序。

NXTServices.JPG

结论

本文向您展示了如何使用 Visual Studio 2010 beta 2 和 WPF 4.0 轻松访问多点触控笔记本电脑的多点触控功能。我希望将来,硬件制造商能够推出更多具有同时触控点的笔记本电脑。我相信仍有许多很棒的多点触控 .NET 应用程序等待被编写。我们需要硬件跟上我们的想象力。

将来,我计划为这个应用程序添加更多功能,以获得更多多点触控机器人控制的乐趣。

历史

  • 2010 年 2 月 2 日 - 文章和源代码的初始发布。
© . All rights reserved.