/ / Zachowanie zdarzenia dotyku / myszy z listbox w WPF i Windows 8 - wpf, vb.net, windows-8, mouseevent, touch-event

Zachowanie zdarzeń Touch / Mouse z listbox w WPF i Windows 8 - wpf, vb.net, windows-8, mouseevent, touch-event

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 № 1

W 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