それらの違いは、入力している文字の種類によって異なります。
- 標準キー: '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 つだけである理由です。