2

我尝试创建一个可以通过多点触控手势移动或调整大小的窗口。我试过这样。我捕获了窗口的 TouchDown-Event 并将所有活动的 TouchDevices 保存在一个列表中,以了解哪些 TouchDevices 是活动的。我捕捉到 TouchDevices 的更新和停用事件,以了解它们何时被移动以及何时被停用。我保存了 Window 的 Left 和 Top 属性以及 TouchDevice 开始的位置,每次调用 Updated 事件时,我都会将 Window 移动到相对于 TouchDevice 的新位置的新位置。如果我移动手指,这将起作用。但是,如果我不移动手指(或只是很少移动),窗口会突然开始摇晃(移动混乱),然后很快消失到屏幕外的某个位置。

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

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

4

1 回答 1

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();
}
于 2015-11-25T21:15:57.083 回答