WPF TouchDevice获取绝对坐标

时间:2013-02-11 20:20:34

标签: wpf multi-touch

我尝试创建一个窗口,可以通过多点触控手势移动或调整大小。我试过这种方式。我捕获窗口的TouchDown-Event并将所有活动的TouchDevices保存在List中,以了解哪些TouchDevices处于活动状态。我捕获TouchDevices的更新和停用事件,以了解它们何时被移动以及何时被停用。我保存窗口的Left和Top属性以及TouchDevice启动的位置以及每次调用Updated事件时我将Window移动到相对于TouchDevice新位置的新位置。如果我移动手指,这是有效的。但是如果我不移动手指(或者只是非常小),窗户突然开始颤抖(混乱地移动),然后很快消失在屏幕外的位置。

我认为这里的问题是,TouchDevice的函数“GetTouchPoint”只提供与窗口相关的相对坐标(即使我将参数设置为null,如果是窗口引用)。并且因为Window移动了TouchDevice(不移动)的相对位置也发生了变化。所以我做了一项研究,但未能找到确定触摸设备屏幕坐标的方法。

所以我希望有人能帮助我如何获得TouchDevice的绝对坐标。或者可以帮我找到另一种方法来“拖动”触摸窗口。(我试过DragMove,但这只适用于鼠标点击,而不是TouchDowns)另外我喜欢在两个Touch设备处于活动状态时调整窗口大小,因此我也需要绝对坐标,因为否则会发生相同的效果。

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题,因为我的任务栏位于屏幕的右边缘,有效地将最大化的窗口推向右侧。当应用程序的窗口未最大化并浮动在屏幕上某处时,也会出现此问题。

这是一个扩展方法,可根据应用程序窗口的位置修复坐标。

public static Point FixCoordinates(this Point point)
{
    var left = Application.Current.MainWindow.Left;
    var top = Application.Current.MainWindow.Top;
    return new Point(point.X + left, point.Y + top);
}

您可能希望传入一个托管触摸控件的窗口作为参数。在我的例子中,它是应用程序的主窗口。

此外,由于您使用“多点触控”标记了问题,因此这是一种平均多个触摸坐标的方法:

public static Point GetAverage(this IEnumerable<Point> points)
{
    var averageX = points.Average(p => p.X);
    var averageY = points.Average(p => p.Y);
    return new Point(averageX, averageY);
}

我在这样的代码中使用它:

private void TouchAdornment_TouchDown(object sender, TouchEventArgs e)
{
    var touchPosition = (sender as UIElement).TouchesOver.Select(t => t.GetTouchPoint(null).Position).GetAverage().FixCoordinates();
}