Ich versuche, eine Windows Forms App auf einem Windows 10-Tablet (Dell Venue 8 Pro) auszuführen. Im Allgemeinen übersetzt Windows Berührungsereignisse in die offensichtlichen Mausereignisse. Allerdings macht es mit vertikalen Swipes etwas seltsam.
Meine App verfügt über ein benutzerdefiniertes Steuerelement (direkt abgeleitet von Control
mit einem Aufruf von SetStyle(ControlStyles.Selectable..., true)
im Konstruktor), das von Direct3D gerenderte Grafiken anzeigt. Das Steuerelement interpretiert MouseDown
- & gt; MouseMove
- & gt; MouseUp
Sequenzen als Anforderungen zum Drehen der Ansicht über die Lookat-Position. Das funktioniert gut auf dem Desktop, aber auf einem Tablet bricht es: vertikale Swipes auf meinem benutzerdefinierten Steuerelement werden irgendwie von Windows abgefangen und an ein nahegelegenes DataGridView
weitergegeben, wo sie als Anforderungen interpretiert werden, um durch die Tabelle zu blättern. Die DataGridView
und meine Kontrolle sind keine Geschwister unter demselben Container; Sie befinden sich auf völlig verschiedenen Ebenen der Kontrollhierarchie. Hier ist ein Screenshot:
Ich habe ein Debugging durchgeführt, um mir selbst zu beweisen, dass keine Mausereignisse während des vertikalen Wischens meine Kontrolle übernehmen. Ein paar Rinnsale rinnen nach rechts, wenn ich meinen Finger hebe, aber während der vertikalen Bewegung gibt es nichts.
Das Problem scheint zu sein, dass mein Code (in den Event-Handlern) einfach nicht ausgeführt wird, weil keine Eingabe zu meinem Steuerelement gelangt.
Was ist hier los, und kann ich Windows irgendwie sagen, dass ich keine vertikalen Swipe-Ereignisse, die über meine Kontrolle passieren, an ein völlig unabhängiges Steuerelement senden soll?
Bearbeiten : Ich sollte hinzufügen, dass ich Focus()
überall in meinem Code anrufe, um sicherzustellen, dass mein Steuerelement fokussiert ist, während die Maus darüber ist. Ich habe es in OnMouseMove
, OnMouseDown
und so ziemlich bei jedem anderen Mausereignis eingegeben.
Bearbeiten : Ich habe eine kleine Visual Studio 2010-Lösung Dieses Problem demonstrieren. Es ist zu viel Code, um hier inline zu reproduzieren, aber es ist einfach zu grok. Erstellen Sie es, installieren Sie es auf einem Windows 10-Tablet, und versuchen Sie, vertikal in dem Steuerelement ganz rechts zu wischen. Beachten Sie, dass das DataGridView
Scroll
auslöst, anstatt dass ein Steuerelement mehrere Mausereignisse empfängt.
Update : Ich habe explizit getestet, ob mein Steuerelement fokussiert ist, wenn DataGridView
ein Scroll
-Ereignis erhält. Wenn ich wie oben erwähnt Focus()
auf meinem Steuerelement als Antwort auf MouseMove
usw. aufruft, erhält mein Steuerelement den Fokus und hält es während des vertikalen Wischens, während DataGridView.Scroll
feuert. Im DataGridView.Scroll
Event-Handler habe ich ausgedruckt, ob meine Kontrolle fokussiert ist, und das ist es. Das ist also keine Frage des Fokus DataGridView
stehlen; Es geht darum, dass DataGridView
einen Swipe behandelt, der für meine Steuerung bestimmt ist, auch wenn meine Steuerung fokussiert ist.
Hinweis : Wenn ich dataGridView.ScrollBars
auf ScrollBars.None
setze, werden die Mausereignisse für den Swipe zu meinem Steuerelement geleitet. Ich habe mit hässlichen Hacks herumgespielt, die die Bildlaufleisten jedes Mal ausblenden, wenn sich meine Kontrolle konzentriert, und sie jedes Mal anzeigen, wenn% ce_de% fokussiert wird. Aber sie sind alle hässliche Hacks mit unangenehmen Nebenwirkungen.
Wie wäre es mit Touch-Events selbst zu handeln und nicht auf eine eigene Implementierung von Microsoft zu warten? link
Tags und Links c# scroll winforms touch windows-10