首页 文章

WPF TouchDevice获取绝对坐标

提问于
浏览
2

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

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

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

1 回答

  • 0

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

    这是 extension method that fixes the coordinates based on the application window's position .

    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();
    }
    

相关问题