3

TextBox に文字を入力し、その内容がキーの押下に応じて変化する場合、KeyDown イベントが引き続き発生するのはなぜですか? これはこの段階で「処理」されると思っていたでしょう。

4

1 に答える 1

4

KeyDownイベントは、であるためbubbling event、ケースウィンドウでその親にバブルされます。それをウィンドウにバブルさせたくない場合は、次のようにtextBoxハンドラー自体で処理済みとしてマークする必要があります-

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
  e.Handled = true;
}

一方、テキストボックスでイベントをフックしようとするとPreviewKeyDown、次のことがわかります。ウィンドウのPreviewKeyDownEventが最初に呼び出され、後でテキストボックスのPreviewKeyDownEventが呼び出されます。その背後にある理由は、それはtunelling eventです。ルーティング戦略については、このリンクを参照してください-ルーティング戦略

Morevoerを編集 して、KeyDownイベントがtextBoxからのものかどうかを確認したい場合は、eventArgsのを確認できOriginalSourceます-

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    // Check to make sure event comes from window and not from textbox.
    if(e.OriginalSource is Window)
    {
    }
}
于 2012-09-03T14:02:25.483 に答える