2

マルチタッチジェスチャーで移動またはサイズ変更できるウィンドウを作成しようとしています。このようにしてみました。ウィンドウの TouchDown イベントをキャプチャし、すべてのアクティブな TouchDevices をリストに保存して、アクティブな TouchDevices を確認します。TouchDevices の更新および非アクティブ化イベントをキャッチして、いつ移動され、いつ非アクティブ化されたかを把握します。Window の Left プロパティと Top プロパティ、および TouchDevice が開始された位置を保存し、Updated イベントが呼び出されるたびに、TouchDevice の新しい位置に相対的な新しい位置に Window を移動します。これは、指を動かすと機能します。しかし、指を動かさないと (またはほんの少しでも)、ウィンドウが突然揺れ始め (無秩序に動き)、すぐに画面の外に消えてしまいます。

ここでの問題は、TouchDeviceの関数「GetTouchPoint」がウィンドウに関連する相対座標のみを提供することだと思います(ウィンドウ参照の代わりにパラメーターnullを設定しても)。また、ウィンドウが移動するため、(移動しない) TouchDevice の相対位置も変化します。そのため、調査を行いましたが、タッチ デバイスの画面座標を特定する方法を見つけることができませんでした。

だから、TouchDeviceの絶対座標を取得する方法を誰かが助けてくれることを願っています. または、タッチでウィンドウを「DragMove」する別の方法を見つけるのに役立ちます(DragMoveを試しましたが、TouchDownではなくマウスクリックでのみ機能します)また、2つのタッチデバイスがアクティブなときにウィンドウのサイズを変更したいので、私も必要ですそれ以外の場合は同じ効果が発生するため、絶対座標。

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 に答える