7

在尝试做一些更复杂的事情时,我遇到了一个我不太理解的行为。

假设下面的代码处理 textChanged 事件。

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

现在,在文本框中输入一个字符(例如,A)将导致事件被触发两次(添加两个“+”),最终显示的文本只是 A+。

我的两个问题是,为什么事件只命中了两次?为什么只有第一次运行事件才能真正设置文本框的文本?

提前致谢!

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 回答