8

これに関するドキュメントはかなり粗雑です。TextCompositionManager経由でアクセスされるテキスト入力を監視および制御するためにフックできるイベントが多数あります。カードのスワイプ データを取得するようなことをしたい場合は、ここで行います。

テキスト入力に関する 3 つのイベントがあります: TextInputTextStart、およびTextUpdate。各イベントには 2 つのバージョンがあります。1 つはイベントがトンネリングする場合(ウィンドウからフォーカスのあるコントロールに移動する) で、もう 1 つはバブリングする場合(フォーカスされた UI 要素からウィンドウに移動する) です。

トンネリング:

  • PreviewTextInputEvent
  • PreviewTextInputStartEvent
  • PreviewTextInputUpdateEvent

バブリング:

  • TextInputEvent
  • TextInputStartEvent
  • TextInputUpdateEvent

そのため、TextCompositionManager にフックする論理ツリーの場所に応じて、これらのテキスト イベントをイベントのフォーカスに到達する前に変更したり、後で表示したりすることができます。これはすべて、ドキュメントと使用中の非常にシンプルで明確です。


TL;DR

3 つのイベントの適切な定義が見つかりません。受け入れられる答えは、3 つのイベント (TextInput、TextInputStart、および TextInputUpdate) を定義するだけでなく、それらを比較対照するものです。回答の共有はありません。情報源を参照してください。ウィキペディアは立ち入り禁止です。あなたの成績の 25% はこれに依存します。

4

1 に答える 1

19

それらの違いは、入力している文字の種類によって異なります。

  • 標準キー: 'a'、'A'、'5'、'%'、Backspace などの印刷可能な文字。
  • コントロール キー: Ctrl+C、Ctrl+H、Ctrl+M など。
  • 10 進キー コード: Alt+テンキー 2 5 5 (IBM 拡張 ASCII コード 255、Unicode 非改行スペース U+00A0) や Alt+テンキー 0 2 5 5 (Windows ANSI コード 255、Unicode U+) など00FF)。有効にするレジストリ設定がある場合は、Alt + テンキーと 2 6 3 B (U + 263B の場合) にも適用される可能性があります。私はこれを確認していません。(レジストリ設定を設定しましたが、すぐには効果がありませんでした。おそらく再起動が必要です。)
  • デッド キー:多言語キーボードには、次のキーストロークを変更する「デッド キー」と呼ばれる余分なものがあることを理解しています。たとえば、「ウムラウト」デッド キーを押してから「o」を押すと、ö (ウムラウト付きの o) が「入力」されます。(詳細が間違っている可能性があります。私は常に en-US キーボードを使用しており、デッド キーを使用する方法がわかりません。) これらは 10 進キー コードと同様に動作すると思われます。下記参照。
  • IME:表意文字言語は、「インプット メソッド エディター」と呼ばれるものを使用します。これらについては、デッド キーよりもさらに知識が少なく、これらのイベントが発生するかどうかもわかりません。

Shift や Ctrl などの修飾キーは、これらのイベントを直接発生させないことに注意してください (Shift が押されてから 5 が押されるなどの KeyDown とは異なります)。たとえば、「%」を取得するための Shift+5 は、1 つのイベント シーケンス (つまり、1 つの TextInputStart と 1 つの TextInput) のみを生成し、両方とも文字列「%」を受け取ります。


TextInputStartは、文字または文字コードの入力を開始するたびに発生します。標準キー、コントロール キー、または 10 進数キー コードの 1 桁目を押すと発生します。これが起動されると、常にではありませんが、システムは、(標準のキーやコントロール キーの場合のように) どのキーを押しているかを既に認識している場合があります。わかっている場合は、TextCompositionEventArgs で通知されます。わからない場合、TextCompositionEventArgs は空であり、何も通知しません。

小数点キーコードの 2 桁目以降を入力すると、 TextInputUpdateが発生します。このイベントの空の TextCompositionEventArgs 以外はまだ確認していません (デッド キーまたは IME で変更される可能性はありますが)。

キーの入力が完了するとTextInputが起動され、システムは入力したキーを確実に認識するため、常に TextCompositionEventArgs に有用な情報が含まれています。このイベントは、文字が実際に「入力」されていることを意味します (つまり、TextBox に入力していた場合に文字が表示されるタイミングに対応します)。


イベントのシーケンスがさまざまなタイプのキャラクターに対してどのように機能するかを次に示します。

標準キー: キーを押すとすぐに TextInputStart が取得され、その後すぐに TextInput が続きます。どちらも TextCompositionEventArgs の内容は同じです。e.Text と e.TextComposition.Text は両方とも、押したキーに設定されます。(これは常に印刷可能な文字ではないことに注意してください。Backspace を押すと、e.Text になります。) キーを押したままにすると、キーの繰り返しごとにイベントのペア (TextInputStart/TextInput) が取得されます。

コントロール キー:文字キーを押すとすぐに、TextInputStart が取得され、その直後に TextInput が続きます。どちらも TextCompositionEventArgs の内容は同じです。e.ControlText と e.TextComposition.ControlText は両方とも、押したコントロール キーに設定されます。文字キーを押したままにすると、キーの繰り返しごとにイベントのペア (TextInputStart/TextInput) が取得されます。

10 進キー コード: Alt+テンキー 0 2 5 5 と入力しているとします。テンキー 0 を押すとすぐに TextInputStart イベントが発生しますが、これはまったく役に立たないことを示しています。numpad 2、numpad 5、および numpad 5 の各キーストロークに対して、TextInputUpdate イベントが発生しますが、ここでも有用な情報はありません (これまでにどの数字が押されたかはわかりません)。Alt キー (入力したコードのキーを実際に「入力」するキー) を放すと、e.Text および e.TextComposition.Text プロパティに入力したキーを使用して、TextInput イベントが発生します。(これは、Alt+テンキー 0 8 を入力した場合など、印刷できない文字である可能性があります。) 10 進キー コードでは、キーリピートはできません。

デッドキー:上で述べたように、これをテストする方法がわかりません。誰かが答えを持っている場合は、私に知らせてください。ここに含めます。

IME:繰り返しますが、これをテストする方法がわかりません。


私の印象では、ほとんどの場合、これらのイベントの中で TextInput を使用するのが理にかなっている唯一のイベントです (他の 2 つは常に何も通知しないため)。これがおそらく、UIElement、UIElement3D、および ContentElement で標準のルーティングされた (アタッチされていない) イベントとして再公開される 3 つのうちの 1 つだけである理由です。

于 2009-06-27T19:03:41.540 に答える