Hilfe zu den WPF-TextCompositionManager-Ereignissen

8

Die Dokumente dazu sind ziemlich schäbig. Es gibt eine Reihe von Ereignissen, die Sie aktivieren können, um Texteingaben zu überwachen und zu steuern, auf die über den TextCompositionManager zugegriffen wird. Wenn Sie etwas wie Snag-Karten-Swipe-Daten machen möchten, würden Sie dies tun.

Es gibt drei Ereignisse, die die Texteingabe betreffen: TextInput , TextStart und TextUpdate . Es gibt zwei Versionen jedes Ereignisses, eines, bei dem das Ereignis tunnelling ist (vom Fenster zum Steuerelement, das den Fokus hat) und wenn es sprudelt (von oben nach unten) das fokussierte UI-Element zum Fenster):

Tunneling:

  • VorschauTextInputEvent
  • VorschauTextInputStartEvent
  • VorschauTextInputUpdateEvent

Sprudeln:

  • TextInputEvent
  • TextInputStartEvent
  • TextInputUpdateEvent

Je nachdem, wo in der logischen Struktur Sie sich im TextCompositionManager einhaken, können Sie diese Text-Ereignisse ändern, bevor sie in den Fokus des Ereignisses gelangen, oder sie einfach danach ansehen. All dies ist ziemlich einfach und klar in der Dokumentation und im Gebrauch.

TL; DR

Ich kann keine vernünftige Definition der drei Ereignisse finden. Eine akzeptable Antwort definiert nicht nur die drei Ereignisse (TextInput, TextInputStart und TextInputUpdate), sondern vergleicht und kontrastiert sie auch. Kein Teilen von Antworten, bitte verweisen Sie auf Ihre Quellen und Wikipedia ist tabu. Davon hängen 25% Ihrer Note ab.

    
Will 27.06.2009, 17:06
quelle

1 Antwort

17

Die Unterschiede zwischen ihnen hängen davon ab, welche Art von Charakter du tippst.

  • Standardtaste: druckbare Zeichen wie 'a', 'A', '5', '%', Rücktaste usw.
  • Strg-Taste: Strg + C, Strg + H, Strg + M, etc.
  • Decimal key code: Dinge wie Alt + numpad 2 5 5 (für IBM erweiterten ASCII-Code 255, die Unicode-geschützter Raum U + 00A0 ist) und Alt + numpad 0 2 5 5 (für Windows ANSI-Code 255, das ist Unicode U + 00FF). Gilt vermutlich auch für Alt + Numpad plus 2 6 3 B (für U + 263B), wenn Sie die Registrierungseinstellung auf haben Aktivieren Sie es ; Ich habe das nicht bestätigt. (Ich habe die Einstellung für die Registrierung festgelegt, aber es hat keine sofortige Wirkung, wahrscheinlich erfordert einen Neustart.)
  • Tote Tasten: Ich verstehe, dass mehrsprachige Tastaturen zusätzliche Dinge haben, die als "tote Tasten" bezeichnet werden, die den folgenden Tastenanschlag verändern. Z. B. könnten Sie die "Umlaut" -Tot-Taste drücken, gefolgt von "o", was ein ö (o mit einem Umlaut) "eintippen" würde. (Ich kann die Details falsch haben. Ich habe immer eine en-US-Tastatur verwendet und ich weiß nicht, wie es dauert, tote Schlüssel zu verwenden.) Ich vermute, dass diese sich ähnlich wie Dezimalschlüssel verhalten würden; siehe unten.
  • IMEs: Ideografische Sprachen verwenden etwas, das als "Eingabemethodeneditor" bezeichnet wird. Ich weiß noch weniger über diese als über tote Schlüssel, und ich habe keine Ahnung, ob sie diese Ereignisse abfeuern oder nicht.

Beachten Sie, dass Modifier-Tasten wie Shift und Ctrl diese Ereignisse nicht direkt auslösen (im Gegensatz zu KeyDown, wo Sie sehen, dass die Shift gedrückt wird, dann die 5 gedrückt wird usw.). Beispielsweise erzeugt Shift + 5, um "%" zu erhalten, nur eine Sequenz von Ereignissen (d. H. Einen TextInputStart und einen TextInput), wobei beide die Zeichenfolge "%" erhalten.

TextInputStart wird immer dann ausgelöst, wenn Sie mit der Eingabe eines Zeichen- oder Zeichencodes beginnen. Es wird ausgelöst, wenn Sie eine Standardtaste, eine Steuertaste oder die erste Ziffer eines Dezimalcodes drücken. Wenn dies ausgelöst wird, weiß das System manchmal, aber nicht immer, welche Taste gedrückt wird (wie bei Standardtasten und Steuertasten). Wenn es weiß, wird es Ihnen in TextCompositionEventArgs sagen; Wenn es nicht bekannt ist, ist der TextCompositionEventArgs leer und sagt nichts.

TextInputUpdate wird ausgelöst, wenn Sie die zweite und folgende Ziffern eines Dezimalschlüsselcodes eingeben. Ich habe noch nichts als ein leeres TextCompositionEventArgs für dieses Ereignis zu sehen (obwohl es möglich ist, dass sich das mit toten Schlüsseln oder IMEs ändert).

TextInput wird ausgelöst, wenn Sie mit der Eingabe des Schlüssels fertig sind, und das System weiß genau, welchen Schlüssel Sie eingegeben haben, so dass es immer nützliche Informationen in TextCompositionEventArgs enthält. Dieses Ereignis bedeutet, dass das Zeichen jetzt tatsächlich "getippt" wird (d. H. Es entspricht dem Zeitpunkt, zu dem das Zeichen angezeigt würde, wenn Sie in eine TextBox tippen würden).

So funktioniert die Reihenfolge der Ereignisse für verschiedene Arten von Zeichen:

Standardtaste: Sobald Sie die Taste drücken, erhalten Sie sofort einen TextInputStart gefolgt von einem TextInput. Beide haben den gleichen Inhalt in ihren TextCompositionEventArgs: e.Text und e.TextComposition.Text werden beide auf die Taste gesetzt, die Sie gedrückt haben. (Beachten Sie, dass dies nicht immer ein druckbares Zeichen ist. Wenn Sie die Rücktaste drücken, befindet es sich in eText.) Wenn Sie die Taste gedrückt halten, erhalten Sie für jede Tastenwiederholung das Ereignispaar (TextInputStart / TextInput).

Strg-Taste: Sobald Sie die Buchstabentaste drücken, erhalten Sie sofort einen TextInputStart gefolgt von einem TextInput. Beide haben den gleichen Inhalt in ihrem TextCompositionEventArgs: e.ControlText und e.TextComposition.ControlText sind beide auf die von Ihnen gedrückte Steuertaste eingestellt. Wenn die Buchstabentaste gedrückt gehalten wird, erhalten Sie für jede Tastenwiederholung das Ereignispaar (TextInputStart / TextInput).

Dezimalschlüssel: Nehmen wir an, Sie tippen Alt + numpad 0 2 5 5. Sobald Sie numpad 0 drücken, erhalten Sie ein TextInputStart-Ereignis, das Ihnen absolut nichts Nützliches sagt. Für jede der Tastenfolgen NUMPAD 2, NUMPAD 5 und NUMPAD 5 erhalten Sie ein TextInputUpdate -Ereignis, wieder ohne nützliche Informationen (Sie können nicht sagen, welche Ziffern bisher gedrückt wurden). Wenn Sie die Alt-Taste loslassen (die den Schlüssel, dessen Code Sie eingegeben haben, tatsächlich "eingibt"), erhalten Sie das TextInput-Ereignis mit dem Schlüssel, den Sie in den Eigenschaften e.Text und e.TextComposition.Text eingegeben haben. (Dies kann ein nicht druckbares Zeichen sein, z. B. wenn Sie Alt + Numpad 0 8 eingegeben haben.) Die Tastenwiederholung ist für Dezimalschlüsselcodes nicht möglich.

Toter Schlüssel: Wie ich oben erwähnt habe, weiß ich nicht, wie ich das testen soll. Wenn jemand die Antwort hat, lass es mich wissen, und ich werde es hier aufnehmen.

IME: Noch einmal, ich weiß nicht, wie ich das testen soll.

Mein Eindruck ist, dass für die meisten Anwendungen TextInput das einzige dieser Ereignisse ist, das es sinnvoll macht, es zu verwenden (da die anderen beiden Ihnen nicht immer etwas sagen).Das ist wahrscheinlich der Grund, warum es das einzige der drei ist, das als standardmäßiges (nicht angehängtes) Ereignis an UIElement, UIElement3D und ContentElement erneut ausgegeben wird.

    
Joe White 27.06.2009, 19:03
quelle