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

当我让它同时处理鼠标和触摸输入时,(PreviewTouchDownPreviewMouseDown)它将接收两个事件(触摸事件和鼠标按钮事件),即使我为首先引发的事件设置event.Handled = True了。TouchEventArgs

如果我从事件处理程序中删除对 PreviewTouchDown 事件的处理,我将不会收到 PreviewMouseDown 事件。

我需要的是每次触摸/点击只调用一次该方法。我无法删除 PreviewMouseDown,因为它不仅用于触摸屏。单次触摸同时传递触摸事件和鼠标事件会破坏我们的功能。

在 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 回答