TextChanged事件-为什么不会导致无限循环?

7

在尝试进行一些更加复杂的操作时,我遇到了一个我不太理解的行为。

假设以下代码处理textChanged事件。

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

现在,在文本框中输入一个字符(比如A),将会触发事件两次(添加两个“+”),最终显示的文本只有A+。我的两个问题是,为什么事件只被触发两次?为什么只有第一次运行事件实际设置了文本框的文本?谢谢!

2
为什么一个看起来毫无意义的问题在不到4分钟内就有3个赞?我不明白... - Mitch Wheat
票数先增加到5,然后又降回3?嗯…… - Mitch Wheat
1
当 TextBox.Text 改变时,将引发事件 TextBox.TextChanged。 然而,示例代码在此通知期间更改文本,这应该导致进一步引发 TextChanged,然后导致新的 Text 更改 ... --> 无限递归。 <br /> 我不知道 TextBox 类明确处理了这种特殊情况 - 所述效果不会发生。 相反,TextChanged 只会被引发一次。 我通过这个问题学到了一些东西,因此我对它进行了投票。 - Matthias
1
能否解释一下哪个部分不太清楚?或者至少提供一些澄清的信息?winSharp93似乎已经理解了。 - Erik Kerber
1个回答

7

在更改文本属性时或刚刚更改时设置文本属性似乎被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;
    }
    //...
}

_isInsideTextContentChange字段在触发TextChanged事件之前被设置为true。因此,再次更改Text属性时,TextChanged事件不会再次触发。

因此:功能;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接