2012-04-18 9 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); 
     } 

:自分自身を強調するプロセスは、次の関数を使用して実装されていますRichTextBoxのテキストが変更されるたびにこれを行います。

プロファイラを実行すると、アプリケーションが処理時間の半分をdocumentRange.ClearAllProperties()に費やしているようです。

アプリケーションの永続性を改善するために変更する必要はありますか?

誰でも、WPF RichTextBoxを使用して高速構文のハイライトの良い例を提供できますか?

答えて

2

タイマーを使用して構文の強調表示コードを呼び出すことをお勧めしますが、おそらく完全な解決策にはなりません。ような何か:(擬似コード)

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

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

あなただけのユーザーが5秒以上一時停止したときに構文強調表示をやっているアイデア、あなたがしようとしていないそのように全体のRichTextBoxを再強調表示1回のキーストロークで

DoSyntaxHighlightingまた、強調表示を開始してユーザーが再度入力を開始すると、ハイライターは処理を停止し、ユーザーによる入力をやめるのを待つことがあります。

ハイライト表示が消えて再び表示されるため、入力が途切れたり停止したりするため、少しファンキーに見えることがあります。しかし、それは間違いなくパフォーマンスを向上させます。

AvalonEditのようなものも見ることができます。

+0

私は同じアイデアを持っていました。もし私に選択肢がなければ、おそらく実装します。しかし、私はむしろそれを適切に行うだろう。私は、これをする良い方法がないと信じることはできません –

関連する問題