2013-02-22 55 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; 
    } 
相關問題