2012-04-18 87 views
3

我使用RichTextBox創建了一個簡單語法突出顯示的編輯器。突出自身的過程是使用下面的函數來實現:在RichTextBox中格式化文本時的性能問題

 TextRange documentRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd); 
     documentRange.ClearAllProperties(); 

     ....... 

     tags.Sort((i, j) => i.Level > j.Level ? 1 : i.Level == j.Level ? 0 : -1); 
     Color []_colors=new Color[]{Colors.Blue,Colors.Brown,Colors.BlueViolet,Colors.Crimson,Colors.DarkBlue, 
      Colors.Green,Colors.DimGray,Colors.DarkGray,Colors.Maroon,Colors.Navy,Colors.Red}; 
     foreach (var tag in tags) 
     { 
      TextRange range = new TextRange(tag.StartPosition, tag.EndPosition); 
      range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(_colors[tag.Level%_colors.Length])); 
      range.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold); 
     } 

的問題是,當我使用這種方法,當有大量的文本關鍵字,應用程序的性能顯著受到影響,尤其是我每次RichTextBoxe的文本更改時都會這樣做。

我運行分析器,似乎應用程序花費了一半的處理器時間在documentRange.ClearAllProperties()中。

我應該改變什麼以改善應用程序的持久性?

任何人都可以提供一個使用WPF RichTextBox快速語法高亮顯示的好例子嗎?

回答

2

我會推薦的一件事可能會有所幫助,但可能不會是一個完整的解決方案,就是使用計時器來調用您的語法高亮代碼。類似:(僞代碼)

OnRichTextChanged() 
{ 
    StopExisingSyntaxHighlighterTimer(); 
    StartSyntaxHighlighterTimer(TimeSpan.FromSeconds(5)); 
} 

OnSyntaxHighlighterTimerFired() 
{ 
    StopExisingSyntaxHighlighterTimer(); 
    DoSyntaxHighlighting(); 
} 

的想法,你只是在做語法當用戶停頓5秒以上高亮,你不是想這種方式重新強調整個的RichTextBox每一次擊鍵。

此外,您甚至可以採取這一步,實際上使DoSyntaxHighlighting可取消,以便如果它開始執行突出顯示並且用戶再次開始鍵入,則突出顯示器將停止處理並等待用戶再次停止鍵入。

這可能看起來有點時髦,因爲突出顯示會在輸入和停止時消失並重新出現。但它肯定會提高性能。

你也可以看看AvalonEdit之類的東西。

+0

我有同樣的想法,如果我沒有任何選擇,我可能會實現它。但我寧願正確地做。我不敢相信,沒有一個好的方法來做到這一點 – 2012-04-18 19:30:35