7

もう少し複雑なことをしようとしているときに、よくわからない動作に出くわしました。

次のコードが textChanged イベントを処理しているとします。

 private void textChanged(object sender, TextChangedEventArgs e)
    {
        TextBox current = sender as TextBox;
        current.Text = current.Text + "+";
    }

ここで、テキストボックスに文字 (たとえば、A) を入力すると、イベントが 2 回発生し (2 つの「+」が追加されます)、最終的に表示されるテキストは A+ になります。

私の 2 つの質問は、イベントが 2 回だけヒットしたのはなぜですか? そして、イベントの最初の実行だけが実際にテキストボックスのテキストを設定するのはなぜですか?

前もって感謝します!

4

1 に答える 1

7

ええと-変更中/変更されたばかりの間にTextプロパティを設定すると、TextBoxクラスによって明示的にキャッチされるようです。

リフレクターを使用してTextBox.OnTextPropertyChanged(短縮)の内部を確認するだけです。

TextBox box = (TextBox) d;
if (!box._isInsideTextContentChange)
{
    string newValue = (string) e.NewValue;
    //...
    box._isInsideTextContentChange = true;
    try
    {
        using (box.TextSelectionInternal.DeclareChangeBlock())
        {
           //...
        } //Probably raises TextChanged here
    }
    finally
    {
        box._isInsideTextContentChange = false;
    }
    //...
}

TextChangedイベントが発生する前に、フィールド_isInsideTextContentChangeがtrueに設定されます。したがって、 Textプロパティを再度変更しても、 TextChangedイベントは再度発生しません。

したがって:機能;-)

于 2010-05-24T16:04:33.503 に答える