3

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を使用した高速シンタックスハイライトの良い例を誰かが提供できますか?

4

1 に答える 1

2

役立つかもしれませんが、おそらく完全な解決策にはならないでしょうが、タイマーを使用して構文強調表示コードを呼び出すことをお勧めします。次のようなもの: (疑似コード)

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

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

ユーザーが 5 秒以上一時停止したときにのみ構文の強調表示を行うという考え。そのようにして、キーストロークごとに RichTextBox 全体を再強調表示しようとはしません。

また、これをさらに一歩進めて、実際にDoSyntaxHighlightingキャンセル可能にすることもできます。これにより、ハイライトの実行が開始され、ユーザーが再び入力を開始した場合、ハイライターは処理を停止し、ユーザーが再び入力を停止するのを待ちます。

これは少し奇妙に見えるかもしれません。なぜなら、ユーザーが入力して停止すると、強調表示が消えて再び表示されるからです。しかし、それは間違いなくパフォーマンスを向上させます。

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

于 2012-04-18T19:28:19.233 に答える