0

Windows 8マシンのリストボックスでマウス入力とタッチ入力の両方を処理しようとすると、予期しない動作が発生します(Windows 7で同じソフトウェアを実行するのとは異なるため)。

これは、イベントを処理している私の関数/メソッドです

Private Sub Drag_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Input.InputEventArgs) Handles lvItems.PreviewMouseDown, lvItems.PreviewTouchDown

マウス入力とタッチ入力の両方を処理するようにすると、(PreviewTouchDownおよび)最初に発生するイベントにを設定したPreviewMouseDown場合でも、両方のイベント(タッチイベントとマウスボタンイベント)を受け取ります。event.Handled = TrueTouchEventArgs

PreviewTouchDownイベントの処理をイベントハンドラーから削除すると、PreviewMouseDownイベントを受け取りません。

私が必要としているのは、タッチ/クリックごとに1回だけメソッドが呼び出されることです。PreviewMouseDownはタッチスクリーンでのみ使用されているわけではないため、削除できません。タッチイベントとマウスイベントの両方を1回のタッチで渡すと、機能が損なわれます。

Windows 7では、handled = trueを設定してマウスイベントがキャンセルされたため、タッチイベントのみを受け取ります。

4

2 に答える 2

0

Windows 8 では、タッチ イベントをマウス イベントに昇格させることができます。これは、タッチを使用して Win8 (Win7 ではなく) でコンボボックスを開くことができるため、便利な場合もありますが、これは望ましくないこともあります。より正確な説明については、JoshB の記事も参照してください。

私の場合、マウス イベント ハンドラで e.StylusDevice == null (マウスを扱うときは null であり、タッチ イベントを扱うときではない) かどうかをチェックしました。多分これもあなたを助けますか?

たとえば、マウスだけでなくタッチもリッスンする ZoomGrid を作成しました。Windows 7 では問題ありませんでしたが、Windows 8 では、タッチムーブ後にパン動作もトリガーされました。e.StylusDevice != null を確認すると修正されました。

    private void MainGridMouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton != MouseButtonState.Pressed) return;
        if (!isDraggingBackground || e.StylusDevice != null) return;
        var curPosition = e.GetPosition(sender as UIElement);
        var delta = curPosition - startPosition;
        var rectsMatrix = ((MatrixTransform)RenderTransform).Matrix;
        rectsMatrix.Translate(delta.X, delta.Y);
        Offset = new Point(rectsMatrix.OffsetX, rectsMatrix.OffsetY);
        RenderTransform = new MatrixTransform(rectsMatrix);
        e.Handled = true;
    }
于 2013-03-14T21:41:25.163 に答える
-1

この問題を解決するために私がしたことは、コンピューターが Windows 8 を実行しているかどうかを検出することでした。実行している場合はHandled、マウス関連のイベントが発生しないように設定しませんでした。

If Not My.Computer.Info.OSFullVersion.Contains("Windows 8") Then
    e.Handled = True
End If
于 2013-02-24T13:19:40.797 に答える