2013-02-22 53 views
0

当我试图处理鼠标和触摸输入列表框上的列表框时,我得到了我认为意外的行为(因为它不同于在Windows 7上运行相同的软件) Windows 8机器。触摸/鼠标事件行为与WPF和Windows 8中的列表框

这是我的功能/方法,它是处理事件

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

当我有它处理两个鼠标和触摸输入,(PreviewTouchDownPreviewMouseDown)其将接收两个事件(A的TouchEvent和mousebuttonevent) ,即使我为TouchEventArgs上的event.Handled = True设置了首先提出的事件。

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

我需要的是该方法只能在每次触摸/点击时调用一次。我无法移除PreviewMouseDown,因为它不仅与触摸屏一起使用。同时触摸事件和鼠标事件触发一次触摸就会破坏我们的功能。

在Windows 7上,我只接收触摸事件,因为我设置了处理= true,所以鼠标事件被取消。

+0

为什么不把所有的功能都放在'PreviewMouseDown'中并且在'PreviewTouchDown'中留下一个存根作为存根以便让'PreviewMouseDown'触发?不理想,但是如果您无法弄清楚什么是错误的话,可能的解决方法。 – mydogisbox 2013-02-22 22:43:33

回答

-1

我所做的解决这个问题的方法是检测计算机是否运行Windows 8,如果没有,则设置Handled以使鼠标没有发生相关事件。

If Not My.Computer.Info.OSFullVersion.Contains("Windows 8") Then 
    e.Handled = True 
End If 
0

在Windows 8上,触摸事件可以升级为鼠标事件。这有时很方便,因为它允许我使用触摸在Win8中打开Combobox(不是在Win7下),有时这也是不受欢迎的,正如您发现的那样。有关更准确的解释,另请参阅JoshB's article

在我的情况下,我检查了鼠标事件处理程序是否e.StylusDevice == 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; 
    } 
相关问题