2015-11-16 7 views
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. Bei vertikalen Swipes macht es jedoch etwas Seltsames.Vertical Swipe simulierte Mausereignisse an falsche Steuerung in Windows Forms App auf Windows 10-Tablet gesendet

Meine App verfügt über ein benutzerdefiniertes Steuerelement (abgeleitet direkt von Control mit einem Aufruf an SetStyle(ControlStyles.Selectable..., true) in seinem Konstruktor), die von Direct3D gerenderte Grafiken zeigt. Das Steuerelement interpretiert MouseDown ->MouseMove ->MouseUp Sequenzen als Anforderungen, um die Ansicht über die Lookat-Position zu drehen. Dies funktioniert auf dem Desktop, aber auf einem Tablet bricht es: vertikale Wischbewegungen auf meinem benutzerdefinierten Steuerelement werden irgendwie von Windows abgefangen und an ein nahegelegenes DataGridView übergeben, wo sie als Anforderungen interpretiert werden, um durch die Tabelle zu scrollen. Die DataGridView und meine Kontrolle sind keine Geschwister unter dem gleichen Container; Sie befinden sich auf völlig verschiedenen Ebenen der Kontrollhierarchie. Hier ist ein Screenshot:

Screenshot of the application showing the different interpretations of vertical and horizontal swipes

Ich habe einige Debug getan um mich zu beweisen, dass keine Mausereignisse, es zu meiner Kontrolle während des vertikalen Swipe machen. Ein paar Rinnsale kommen rein, wenn ich meinen Finger hebe, aber während des vertikalen Streichens gibt es nichts.

Das Problem scheint zu sein, dass mein Code (in den Ereignishandlern) einfach nicht ausgeführt wird, weil keine Eingabe zu meiner Kontrolle gelangt.

Was passiert hier, und gibt es irgendeine Möglichkeit, dass ich Windows sagen kann, vertikale Swipe-Ereignisse, die über meine Kontrolle passieren, an eine völlig unabhängige Steuerung zu senden?

Bearbeiten: Ich sollte hinzufügen, dass ich Focus() überall in meinem Code aufrufen, um sicherzustellen, dass meine Kontrolle konzentriert ist, während die Maus darüber ist. Ich steckte es in OnMouseMove, OnMouseDown, und so ziemlich auf jedem anderen Mausereignis.

Bearbeiten: Ich habe ein small Visual Studio 2010 solution gebaut, das dieses Problem demonstriert. 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 Steuerelement DataGridViewScroll auslöst, anstatt dieses Steuerelement mehrere Mausereignisse zu empfangen.

Update: Ich habe explizit getestet, ob meine Steuerung fokussiert ist, wenn die DataGridView ein Scroll Ereignis erhält. Wenn ich Focus() auf meinem Steuerelement in Erwiderung auf MouseMove etc. wähle, wie oben erwähnt, erhält meine Steuerung den Fokus und hält es während des vertikalen Streichens, während DataGridView.Scroll feuert. Im DataGridView.Scroll Event-Handler habe ich ausgedruckt, ob meine Kontrolle fokussiert ist, und es ist. Das ist also keine Frage des stehlenden DataGridView; Es ist eine Frage der DataGridView Handhabung eines Swipe für meine Kontrolle, auch wenn meine Kontrolle konzentriert ist.

Hinweis: Wenn ich dataGridView.ScrollBars zu ScrollBars.None gesetzt, die Mausereignisse für das Streichen Sie zu meiner Kontrolle gehen. Ich habe mit hässlichen Hacks rumgespielt, die die Bildlaufleisten jedes Mal ausblenden, wenn sich meine Kontrolle konzentriert, und sie jedes Mal zeigen, wenn die DataGridView fokussiert wird. Aber sie sind alle hässliche Hacks mit unangenehmen Nebenwirkungen.

+0

Klingt, als könnte es ein Problem mit der Verwaltung sein, welches Element die Kontrolle über das Berührungsereignis hat. Es wäre besser, wenn Sie etwas Code teilen könnten. Sonst werden die Antworten theoretisch und breit sein. Das könnte gut sein, könnte aber auch ein bisschen Glück sein. –

+1

Okay, für den Ehrgeizigen habe ich einen Link zu einer gezippten VS-Lösung hinzugefügt, die das Problem reproduziert (wenn sie auf einem Windows 10-Tablet ausgeführt wird). Es war zu viel Code, um inline zu schreiben, obwohl vieles davon Designer-Code und repetitiver Event-Handler-Code ist. – adv12

+0

hey danke, dass es sehr nützlich ist. Mein größtes Problem ist das einzige Touch-Gerät, auf dem ich Windows 10 installiert habe, das ich zurückgerollt habe, also werde ich mir den Code gut anschauen und wenn ich Zeit habe, ein Testgerät organisieren. In der Zwischenzeit könnte jemand anderes aufkreuzen. –

Antwort

1

Wie behandeln Touch-Ereignisse auf eigene Faust und nicht erwarten, eine ordnungsgemäße Implementierung von Microsoft eigenen. link

+0

Für zukünftige Leser: nur 'RegisterTouchWindow' auf dem Fenstergriff des benutzerdefinierten Steuerelements aufrufen ist genug, um die zu stoppen 'DataGridView' vom Scrollen als Antwort auf einen vertikalen Swipe auf dem benutzerdefinierten Steuerelement. Windows konvertiert weiterhin Berührungsereignisse in Mausereignisse für das benutzerdefinierte Steuerelement, sodass Einzelfingerberührungsszenarien "einfach funktionieren". Leider erhält Ihr Steuerelement jetzt keine 'WM_GESTURE'-Nachrichten, sodass Sie Multi-Touch-Gesten (wie Prise/Stretch) selbst erkennen müssen. Der verknüpfte Artikel, kombiniert mit dem vollständigen Quellcode (in den Windows 7.1 SDK-Beispielen), sollte Ihnen den Einstieg erleichtern. – adv12