2010-05-24 169 views
7

在試圖做一些更復雜的事情時,我碰到了一個我不太明白的行爲。TextChanged事件 - 爲什麼這不會導致無限循環?

假設下面的代碼處理textChanged事件。

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

現在,輸入在文本框中的字符(比如A)將導致事件得到與最終文本絆倒兩次(添加兩個「+」 S)顯示的僅僅是一個+。

我的兩個問題是,爲什麼事件只發生兩次?爲什麼只有第一次穿過事件才能真正設置文本框的文本?

在此先感謝!

+2

爲什麼一個似乎沒有多大意義的問題在4分鐘內就有3個upvotes?我不明白.... – 2010-05-24 15:55:00

+0

...上漲到5票,然後回到3? hmmmmm ... – 2010-05-24 16:00:10

+1

事件TextBox.TextChanged在TextBox.Text發生更改時引發。但是,示例代碼會在此通知期間更改文本,這會導致TextChanged的進一步升高,從而導致Text的新更改,這將會...... - >無限遞歸。
我不知道這個特殊情況是由TextBox類明確處理的 - 所描述的效果不會發生。相反,TextChanged只會被提升一次。我通過這個問題學到了一些東西,因此得到了提升。 – Matthias 2010-05-24 16:10:18

回答

7

好 - 設置Text屬性,當它被改變了/而它剛剛改變似乎是由文本框類明確被抓:

只需使用反射來看看裏面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被設置爲true 框TextChanged前事件得到[R aised。當再次更改文本屬性時,TextChanged事件因此不會再次引發。

因此:特徵;-)

相關問題