Vertikale, simulierte Mausereignisse, die an die falsche Steuerung in der Windows Forms App auf Windows 10-Tablet gesendet wurden

8

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.

    
adv12 16.11.2015, 20:49
quelle

1 Antwort

1

Wie wäre es mit Touch-Events selbst zu handeln und nicht auf eine eigene Implementierung von Microsoft zu warten? link

    
Yosh Synergi 01.12.2015, 07:53
quelle

Tags und Links