2012-06-05 98 views
4

我正在處理根據正則表達式模式在RichTextBox中突出顯示文本的應用程序。 它工作正常,除了性能,即使對於小文本(約500個字符)它掛起一段時間,這是用戶可見。RichTextBox突出顯示性能

我在做錯誤的FlowDocument?有人可以指出我對性能問題的根源嗎?

public class RichTextBoxManager 
{ 
    private readonly FlowDocument inputDocument; 
    private TextPointer currentPosition; 

    public RichTextBoxManager(FlowDocument inputDocument) 
    { 
     if (inputDocument == null) 
     { 
      throw new ArgumentNullException("inputDocument"); 
     } 

     this.inputDocument = inputDocument; 
     this.currentPosition = inputDocument.ContentStart; 
    } 

    public TextPointer CurrentPosition 
    { 
     get { return currentPosition; } 
     set 
     { 
      if (value == null) 
      { 
       throw new ArgumentNullException("value"); 
      } 
      if (value.CompareTo(inputDocument.ContentStart) < 0 || 
       value.CompareTo(inputDocument.ContentEnd) > 0) 
      { 
       throw new ArgumentOutOfRangeException("value"); 
      } 

      currentPosition = value; 
     } 
    } 

    public TextRange Highlight(string regex) 
    { 
     TextRange allDoc = new TextRange(inputDocument.ContentStart, inputDocument.ContentEnd); 
     allDoc.ClearAllProperties(); 
     currentPosition = inputDocument.ContentStart; 

     TextRange textRange = GetTextRangeFromPosition(ref currentPosition, regex); 
     return textRange; 
    } 

    public TextRange GetTextRangeFromPosition(ref TextPointer position, 
               string regex) 
    { 
     TextRange textRange = null; 
     while (position != null) 
     { 
      if (position.CompareTo(inputDocument.ContentEnd) == 0) 
      { 
       break; 
      } 

      if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) 
      { 
       String textRun = position.GetTextInRun(LogicalDirection.Forward); 
       var match = Regex.Match(textRun, regex); 
       if (match.Success) 
       { 
        position = position.GetPositionAtOffset(match.Index); 
        TextPointer nextPointer = position.GetPositionAtOffset(regex.Length); 
        textRange = new TextRange(position, nextPointer); 
        textRange.ApplyPropertyValue(TextElement.BackgroundProperty, Brushes.Yellow); 
        position = nextPointer; 
       } 
       else 
       { 
        position = position.GetPositionAtOffset(textRun.Length); 
       } 
      } 
      else 
      { 
       position = position.GetNextContextPosition(LogicalDirection.Forward); 
      } 
     } 

     return textRange; 
    } 
} 

稱呼它,我第一次在初始化方法

frm = new RichTextBoxManager(richTextBox1.Document); 

和textchange事件文本框(這裏我把正則表達式),我稱之爲亮點方法

frm.Highlight(textBox1.Text); 

回答

0

此創建一個實例是一種不同的方法,但我使用它在200,000個字符的文件上進行二級響應。

由於我從文字開始,因此這可能不適合您。

我爲文字位置索引文本文件,用戶可以在文字上搜索。我強調他們搜索的詞。

但是我循環遍歷文本來創建FlowDoc,並在構建FlowDoc時突出顯示。這個FlowDoc沒有格式(高亮除外)。所以如果你需要保存格式,這是行不通的。

所以我的猜測是TextPointer是一個很大的開銷。

但是我從代碼中學到了很多東西,因爲這是我試圖突出工作的方式,但是我無法讓TextPointer工作。

也許看看處理textRun中的所有匹配,而不僅僅是第一個,並增加位置。

相關問題