WPF-Anwendung, die Breite Erfassung von key up/down-events
Ich versuche zu erfassen keypress-Ereignisse überall in meiner WPF-Anwendung, unabhängig davon, welches UI-element den Fokus hat. Derzeit bin ich mit kein Glück. Kann jemand empfehlen einige Strategien, die ich nicht versucht haben? Oder, im Idealfall, eine Antwort wie "oh, dass ist leicht, Sie genau dies tun".
Es ist eine verteilte Anwendung, die einen chat-system. Der Effekt, den ich Suche, ist, dass der Benutzer mit der Eingabe beginnen eine chat-Nachricht jederzeit, ohne den Wechsel zu einem standard-chat-box. Ich werde Ihre Nachricht in der Anwendung selbst, mit FormattedText-Objekte. Dies ist wichtig, weil es bedeutet, es gibt keine text-input-Elemente in der Anwendung und überall.
Meiner XAML-Struktur sieht in etwa wie:
<MainWindow>
<Canvas 1>
<Canvas 2>
<Image 1 />
</Canvas 2>
<Image 2 />
</Canvas 1>
</MainWindow>
Ich Programmgesteuertes hinzufügen von Elementen in Canvas 2, und zu manipulieren, Bild 2, die ist, warum es ist, die Struktur.
Ich habe versucht, indem KeyDown, KeyUp und die Vorschau von Veranstaltungen zu MainWindow und Leinwand 1, aber keiner von Ihnen scheinen, um das Feuer (ich überprüfen Sie mit Haltepunkten). Ich habe auch nach dem Lesen eine weitere damit zusammenhängende Frage ist hier, versucht manuell festlegen des Fokus auf das main-Fenster in die Loaded () - Methode.
Ich weiß, es sind viele Fragen auf dieser Website, aber Sie haben mir nicht geholfen, weil:
- es gibt keine Antworten (wird meine Frage beantwortet werden?)
- übernehmen Sie eine text-Eingabe-widget und sind daran interessiert, sprudeln Ereignisse
- Sie möchten eine Tastenbelegung für eine kleine Anzahl von Tasten - ich würde gerne erfassen alle Schlüssel
- Sie daran interessiert sind, erkennen, wenn ein control/shift/alt-Taste gedrückt, nachdem Sie bereits gefangen die Veranstaltung
Vielen Dank für die Zeit nehmen, zu Lesen, mein langatmige post, und danke für die Anregungen.
Update (Nach Rachel ' s Kommentar), Wenn ich in ein Textfeld, und legen Sie den Fokus auf das Textfeld, ein Schlüssel-Ereignis-Methode in der MainWindow-Ebene ausgelöst wird. So, das funktioniert wie angepriesen.
Allerdings, möchte ich wirklich nicht haben eine explizite Eingabe von text-widget in der Anwendung überhaupt. Ich möchte die Benutzer in der Lage sein zu fangen Sie einfach eine Nachricht.
- Siehe auch meine Antwort hier: stackoverflow.com/a/42484932/2025364
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein wenig basteln hab mir das:
XAML:
CS:
Dieser druckt Sachen wie "Shift", So dass Sie hatten ganz offensichtlich haben, um Schalter zu verwenden... aber es ist ein Textfeld, speichert Tastatureingaben.
Habe ich es geschafft, es klappt, inspiriert durch die Antwort von Rachel und WernerCD. Wie Sie beide bewiesen, dass die Ereignis-capture auf die MainWindow-Ebene funktioniert. Das problem war, dass ich Sie vernachlässigt, um zu erwähnen, dass ich einen dialog, bevor das MainWindow geladen, das scheint zu stören mit der normalen Tastatur-Fokus auf das MainWindow. Setzen explizite Tastatur.Fokus() in der Geladenen () - Methode ist zu früh. Habe das problem behoben, indem Sie die Tastatur.focus() in den MainWindow_ContentRendered () - Methode.
Alles ist jetzt gut (, bis die nächste Ausgabe sowieso). Vielen Dank für die Hilfe.
Ich in der Regel fügen Sie ein PreviewKeyDown-Ereignis an das MainWindow.
Vielleicht ist Ihr problem ist, dass Sie keine Kontrolle haben akzeptiert, dass die Tastatur sich auf Ihre Applikation konzentrieren. Bekommen Sie die gleichen Ergebnisse, wenn Sie fügen Sie ein Textfeld, um das Hauptfenster und den Fokus eingestellt?
<MainWindow>
tag in Ihrem XAML-code, der irgendetwas besonderes?