2017-04-25 78 views
1

我有一個RichTextBox,用戶可以在其中按照以下規則即時輸入一些帶有顏色代碼的文本。高效地對RichTextBox中的文本進行顏色編碼

  1. { } () | . (dot)這些字符應該是紅色的。
  2. [A-Z] [a-z] [0-9]下劃線和連字符。這些應該是深灰色的。
  3. 其他一切都應該是藍色的。

現在我在事件框中的內容發生變化時就有了這段代碼。 只要在文本框的內容中檢測到更改,就會調用此方法。

public void colorCode() { 
    for (int i = 0 ; i < rtb.Text.Length ; i++) { 
     rtb.Select(i,1); //select a single character 
     char ch = rtb.Text[i]; 
     if (ch == '{' || ch == '}' || 
      ch == '(' || ch == ')' || 
      ch == '.') 
      rtb.SelectionColor = Color.Red; 
     else if (isAlphaNumeric(ch)) 
      rtb.SelectionColor = Color.DarkGrey; 
     else 
      rtb.SelectionColor = Color.Blue; 
    } 
} 

正如你所看到的,當有數百個字符時,這可能會非常緩慢。我該如何改善這種情況。

+0

您可以嘗試排隊更新,而不是在每次更改後運行它們,請參閱[this](http://stackoverflow.com/q/15587767/1997232)。 – Sinatr

+0

@Sinatr更加詳細的答案將不勝感激。 –

+1

也許你可以使用支持語法高亮顯示的編輯器,如[AvalonEdit](http://avalonedit.net)。在[documentation](http://avalonedit.net/documentation/)中,你可以找到[如何定義你自己的規則](http://avalonedit.net/documentation/html/4d4ceb51-154d-43f0-b876-ad9640c5d2d8熱媒)。 – Oliver

回答

0

您可以在KeyUp事件上做到這一點,因此您只查看更改過的單個字符。不知道這是否會更快,如果有的話。

private void rtb_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 

    if (e.KeyCode == Keys.OemPeriod 
     rtb.SelectionColor = Color.Red; 
    ... 
    } 
} 
+0

沒有違法,但這應該是一個評論,而不是一個答案。我不會去,但有人可能會對這個答案投下贊成票。現在關於您的解決方案,我將如何確切地知道發生了哪些變化。它可能位於文本框中已有的內容之間。 –

+0

不知道我理解你的問題在哪裏發生變化。 KeyUp事件將有一個事件arg,告訴你什麼按鍵被按下,所以你可以在那個時候評估單個字符應該是什麼顏色,而不是循環所有先前輸入的文本。 https://msdn.microsoft.com/en-us/library/system.windows.forms.control.keyup(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet -2( –

+0

)假設這是'abcdef'框內的文本((''現在用戶把光標放在字母'c'旁邊,然後按下'{'。現在按照你的邏輯,我知道按了什麼鍵,但是我不知道't在字符串的哪個位置 –