我尝试创建一个窗口,可以通过多点触控手势移动或调整大小。我试过这种方式。我捕获窗口的TouchDown-Event并将所有活动的TouchDevices保存在List中,以了解哪些TouchDevices处于活动状态。我捕获TouchDevices的更新和停用事件,以了解它们何时被移动以及何时被停用。我保存窗口的Left和Top属性以及TouchDevice启动的位置以及每次调用Updated事件时我将Window移动到相对于TouchDevice新位置的新位置。如果我移动手指,这是有效的。但是如果我不移动手指(或者只是非常小),窗户突然开始颤抖(混乱地移动),然后很快消失在屏幕外的位置。
我认为这里的问题是,TouchDevice的函数“GetTouchPoint”只提供与窗口相关的相对坐标(即使我将参数设置为null,如果是窗口引用)。并且因为Window移动了TouchDevice(不移动)的相对位置也发生了变化。所以我做了一项研究,但未能找到确定触摸设备屏幕坐标的方法。
所以我希望有人能帮助我如何获得TouchDevice的绝对坐标。或者可以帮我找到另一种方法来“拖动”触摸窗口。(我试过DragMove,但这只适用于鼠标点击,而不是TouchDowns)另外我喜欢在两个Touch设备处于活动状态时调整窗口大小,因此我也需要绝对坐标,因为否则会发生相同的效果。
答案 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();
}