Wpf-UI前沿技术-WPF 中的多点触控操作事件

  • 格式:pdf
  • 大小:624.45 KB
  • 文档页数:8

UI 前沿技前沿技术术

WPF 中的多点触控操作事件 Charles Petzold

下载代码示例

[ http://code.msdn.microsoft.com/mag201008UF.aspx ]

就在过去几年,多点触控还只是科幻电影中表现未来主义的一种重要手法,现在俨然已经成为主

流的用户界面技术。 多点触控显示屏现在成了新型智能手机和

Tablet 计算机的标准显示屏。 此外,它还可能在公

共场所的计算机上普及,例如

Microsoft Surface 率先开发的网亭或桌面计算机。

实际存在的唯一不确定因素是多点触控在常规台式计算机上的普及。 这种普及的最大障碍或许是长时间在垂直屏幕

上移动手指所产生的疲劳(称为“大猩猩手臂”)。 我个人希望多点触控的强大功能将切实推进桌面显示屏的重新

设计。 我们可以设想台式计算机的显示屏可能类似于配置制图桌,并且可能和制图桌一样大。

但那可能发生在遥远的未来。 目前,开发人员需要掌握新的

API。

Windows 7 中的多点触控支持已通过低级别和

高级别的接口渗透并应用到

Microsoft .NET Framework 的各个领域。

了解多了解多点点触控支持控支持

如果您考虑到在显示屏上使用多根手指可能引起表达的复杂性,您或许就会了解为何到现在还没有人确切知道多点

触控的“正确”编程接口。 这需要一定时间。 同时,您具有若干选择。

Windows Presentation Foundation (WPF) 4.0 为在

Windows 7 下运行的程序提供了两个多点触控接口。 为了专

门使用多点触控,程序员希望探索低级别接口,该接口包含由

UIElement 定义的多个路由事件(名为

TouchDown、

TouchMove、

TouchUp、

TouchEnter 和

TouchLeave)以及向下、移动和向上事件的预览版本。 显

然,这些事件是根据鼠标事件建模的,但需要一个整数

ID 属性来跟踪显示屏上的多根手指。

Microsoft Surface 在

WPF 3.5 的基础上构建,不过它支持范围更广的低级别触控接口,可区分触控输入的类型和形状。

本专栏的主题是

WPF 4.0 中的高级别多点触控支持,它包含一个名称以“

Manipulation”一词开头的事件的集合。

这些操作事件执行多个关键的多点触控作业:

󰁺将两根手指的交互合并成单个操作

󰁺将一根或两根手指的移动解析成转换

󰁺在手指离开屏幕时实现延时

Silverlight 4 文档中列出了部分操作事件,但可能会让读者产生一丝迷惑。

Silverlight 本身不支持这些事件,但针

Windows Phone 7 编写的

Silverlight 应用程序则支持这些事件。 图

1 列出了这些操作事件。

1 Windows Presentation Foundation 4.0 中的操作事件

©2010 Microsoft Corporation. All rights reserved.

事件事件

是否受

Windows Phone 7 支持支持??

ManipulationStarting 不能

ManipulationStarted 能

ManipulationDelta 能

基于

Web 的

Silverlight 4 应用程序将继续使用

Touch.FrameReported 事件,我曾在

2010 年

3 月出版的

MSDN

杂志“手指之舞:探讨

Silverlight 中的多点触控支持”一文中探讨过该事件。

除操作事件本身以外,

WPF 中的

UIElement 类还支持与操作事件对应的可覆盖方法,例如,

On-

ManipulationStarting。 在

Silverlight for Windows Phone 7 中,这些可覆盖方法由

Control 类定义。

多点触控示例控示例

照片查看器可能是多点触控的典型应用,在照片查看器中,您可以在一个平面上移动照片,用两根手指放大或缩小

照片以及旋转照片。 这些操作有时称为平移、缩放和旋转,它们分别对应于平移、缩放和旋转的标准图形转换。

很明显,照片查看程序需要维护照片集合,支持添加新照片和删除照片,并且最好能始终在一个较小的图形帧中显

示多张照片,但我准备忽略所有这些方面,而着重介绍多点触控交互。 有了操作事件,一切都变得非常简单,这让

我感到非常吃惊,我相信你们也会有同感。

本专栏的所有源代码位于一个名为

WpfManipulationSamples 的可下载解决方案中。 第一个项目是

SimpleManipulationDemo,

MainWindow.xaml 文件在图

2 中显示。

2 SimpleManipulationDemo 的

XAML 文件

首先,请注意所有三个

Image 元素上的设置: ManipulationInertiaStarted 不能

ManipulationBoundaryFeedback 否

ManipulationCompleted 是

复制代码

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Simple Manipulation Demo">

IsManipulationEnabled="True"

RenderTransform="0.5 0 0 0.5 100 100" />

IsManipulationEnabled="True"

RenderTransform="0.5 0 0 0.5 200 200" />

IsManipulationEnabled="True"

RenderTransform="0.5 0 0 0.5 300 300" />

IsManipulationEnabled="True"

RenderTransform="0.5 0 0 0.5 400 400" />

默认情况下,此属性为

false。 对于您希望在其上获得多点触控输入并生成操作事件的任何元素,您必须将其设置

true。

操作事件是

WPF 路由事件,这意味着这些事件会使可视化树浮现出来。 在此程序中,

Grid 和

MainWindow 的

IsManipulationEnabled 属性均未设置为

true,但您仍可将操作事件的处理程序附加至

Grid 和

MainWindow 元

素,或者在

MainWindow 类中覆盖

OnManipulation 方法。

另请注意,每个

Image 元素将其

RenderTransform 设置为一个六位数的字符串:

这是设置已初始化的

MatrixTransform 对象的

RenderTransform 属性的快捷方式。 在此特定示例中,设置为

MatrixTransform 的

Matrix 对象已经过初始化,可执行

0.5 个单位的缩放(使照片缩小至实际大小的一半)和朝

右下方的

100 个单位的平移。 该窗口的代码隐藏文件会访问并修改此

MatrixTransform。

3 显示了完整的

MainWindow.xaml.cs 文件,该文件仅覆盖两个方法,即

OnManipulationStarting 和

OnManipulationDelta。 这些方法处理由

Image 元素生成的操作。

3 SimpleManipulationDemo 的代的代码隐码隐码隐藏文件藏文件 复制代码IsManipulationEnabled="True"

复制代码RenderTransform="0.5 0 0 0.5 100 100"

复制代码

using System.Windows;

using System.Windows.Controls;

using System.Windows.Input;

using System.Windows.Media;

namespace SimpleManipulationDemo {

public partial class MainWindow : Window {

public MainWindow() {

InitializeComponent();

}

protected override void OnManipulationStarting(

ManipulationStartingEventArgs args) {

args.ManipulationContainer = this;

// Adjust Z-order

FrameworkElement element =

args.Source as FrameworkElement;

Panel pnl = element.Parent as Panel;

for (int i = 0; i < pnl.Children.Count; i++)

Panel.SetZIndex(pnl.Children[i],

pnl.Children[i] ==

element ? pnl.Children.Count : i);

args.Handled = true;

base.OnManipulationStarting(args);

}

protected override void OnManipulationDelta(

ManipulationDeltaEventArgs args) {

UIElement element = args.Source as UIElement;

MatrixTransform xform =

element.RenderTransform as MatrixTransform;