Otrzymuję to, co uważam za nieoczekiwane zachowanie (ponieważ różni się od uruchamiania tego samego oprogramowania w systemie Windows 7), gdy próbuję obsłużyć zarówno mysz, jak i dane dotykowe w polu listy na komputerze z systemem Windows 8.
To jest moja funkcja / metoda, która obsługuje zdarzenia
Private Sub Drag_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Input.InputEventArgs) Handles lvItems.PreviewMouseDown, lvItems.PreviewTouchDown
Kiedy go obsłużę, obsługuję zarówno mysz, jak i dane dotykowe (PreviewTouchDown
i PreviewMouseDown
) otrzyma oba zdarzenia (A touchevent i mousebuttonevent), mimo że ustawiłem event.Handled = True
na TouchEventArgs
na wydarzenie, które jest podnoszone jako pierwsze.
Jeśli usunę obsługę zdarzenia PreviewTouchDown z procedury obsługi zdarzeń, nie otrzymam zdarzenia PreviewMouseDown.
Potrzebuję tylko, aby metoda została wywołanaraz na dotyk / kliknięcie. Nie mogę usunąć PreviewMouseDown, ponieważ nie jest to używane tylko z ekranami dotykowymi. Przekazanie zdarzenia dotyku i zdarzenia myszy dla jednego dotyku psuje naszą funkcjonalność.
W Windows 7 odbieram tylko zdarzenia dotykowe, ponieważ ustawiłem handled = true, więc zdarzenia myszy są anulowane.
Odpowiedzi:
0 dla odpowiedzi № 1W systemie Windows 8 zdarzenia dotykowe można promowaćzdarzenia myszy. Jest to czasami wygodne, ponieważ pozwala mi otworzyć Combobox w Win8 (nie pod Win7) za pomocą dotyku, a czasem jest to niepożądane, jak odkryłeś. Zobacz też Artykuł JoshB dla dokładniejszego wyjaśnienia.
W moim przypadku sprawdziłem w module obsługi zdarzeń myszy, czy e.StylusDevice == null (w przypadku myszy jest ona zerowa, a nie w przypadku zdarzenia dotykowego). Może to ci też pomaga?
Na przykład stworzyłem ZoomGrid, który nasłuchujemysz i dotyk. W systemie Windows 7 nie było problemu, ale w systemie Windows 8 zachowanie panoramowania zostało również uruchomione po przesunięciu dotykowym. Sprawdzanie e.StylusDevice! = Null to naprawiło.
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;
}
-1 dla odpowiedzi № 2
Aby rozwiązać ten problem, wykryłem, czy na komputerze jest zainstalowany system Windows 8, a jeśli tak, to NIE jest to ustawienie Handled
tak że nie wystąpiło zdarzenie związane z myszą.
If Not My.Computer.Info.OSFullVersion.Contains("Windows 8") Then
e.Handled = True
End If