WPF Anwendungsweite Erfassung von Key-Up / Down-Ereignissen

8

Ich versuche, überall in meiner WPF-Anwendung Tastendruckereignisse zu erfassen, unabhängig davon, welches UI-Element den Fokus hat. Momentan habe ich kein Glück. Kann jemand Strategien vorschlagen, die ich vielleicht nicht versucht habe? Oder geben Sie im Idealfall eine Antwort wie "Oh, das ist einfach, Sie tun das einfach".

Es ist eine verteilte Anwendung, die über ein Chat-System verfügt. Der Effekt, den ich suche, besteht darin, dass der Benutzer jederzeit mit dem Schreiben einer Chat-Nachricht beginnen kann, ohne zu einer Standard-Chat-Box wechseln zu müssen. Ich werde ihre Nachricht in der Anwendung selbst anzeigen und dabei FormattedText-Objekte verwenden. Dies ist wichtig, da es in der Anwendung keine Texteingabeelemente gibt.

Meine XAML-Struktur sieht ungefähr so ​​aus:

%Vor%

Ich füge programmgesteuert Elemente in Canvas 2 ein und manipuliere Image 2, weshalb es diese Struktur hat.

Ich habe versucht, KeyDown, KeyUp und die Vorschau-Ereignisse zu MainWindow und Canvas 1 hinzuzufügen, aber keiner von ihnen scheint zu feuern (ich überprüfe mit Haltepunkten). Ich habe auch, nachdem ich eine andere verwandte Frage hier gelesen habe, versucht, den Fokus auf das Hauptfenster in der Methode Loaded () manuell einzustellen.

Ich weiß, dass es auf dieser Site viele verwandte Fragen gibt, aber sie haben mir nicht geholfen, weil:

  • gibt es keine Antworten (wird meine Frage beantwortet?)
  • sie nehmen ein Texteingabe-Widget an und interessieren sich für sprudelnde Ereignisse
  • sie wollen eine Tastenkombination für eine kleine Anzahl von Schlüsseln - ich möchte jeden Schlüssel erfassen
  • sie sind daran interessiert herauszufinden, ob eine Control / Shift / Alt-Taste gedrückt ist, nachdem sie das Ereignis bereits erfasst haben

Danke, dass Sie sich die Zeit genommen haben, meinen langatmigen Beitrag zu lesen, und vielen Dank für Ihre Vorschläge.

Aktualisieren (Nach Rachels Kommentar) Wenn ich eine TextBox einfüge und den Fokus auf die TextBox setze, wird eine Schlüsselereignismethode auf der MainWindow-Ebene ausgelöst. Das funktioniert wie angekündigt.

Ich möchte jedoch wirklich kein explizites Texteingabe-Widget in der Anwendung haben. Ich möchte, dass der Benutzer einfach mit dem Tippen beginnen kann, um eine Nachricht zu verfassen.

    
cursa 03.12.2010, 17:19
quelle

3 Antworten

5

Ein bisschen Basteln brachte mir das:

XAML:

%Vor%

CS:

%Vor%

Dies druckt Sachen wie "Shift" aus. Sie müssten also natürlich Schalter verwenden ... aber es hat ein Textfeld, in dem Tasten gedrückt werden.

    
WernerCD 03.12.2010 17:55
quelle
3

Ich habe es geschafft, es auszuarbeiten, inspiriert von den Antworten von Rachel und WernerCD . Wie beide gezeigt haben, funktioniert die Ereigniserfassung auf MainWindow-Ebene. Das Problem war, dass ich nicht erwähnen wollte, dass ich vor dem MainWindow einen Dialog hatte, der den normalen Tastaturfokus auf das MainWindow zu stören scheint. Putting explizit Keyboard.focus () in der Loaded () -Methode ist zu früh. Ich habe das Problem behoben, indem ich Keyboard.focus () in die MainWindow_ContentRendered () -Methode gesetzt habe.

Alles ist jetzt gut (bis zur nächsten Ausgabe sowieso). Danke für die Hilfe.

    
cursa 03.12.2010 19:23
quelle
2

Normalerweise füge ich dem MainWindow ein PreviewKeyDown-Ereignis hinzu.

Vielleicht ist Ihr Problem, dass Sie kein Steuerelement haben, das den Tastaturfokus für Ihre Anwendung akzeptiert. Erhalten Sie die gleichen Ergebnisse, wenn Sie dem MainWindow eine TextBox hinzufügen und den Fokus dort festlegen?

    
Rachel 03.12.2010 17:31
quelle

Tags und Links