4

正規表現パターンに従って RichTextBox 内のテキストを強調表示するアプリケーションに取り組んでいます。小さいテキスト (約 500 文字) の場合でも、パフォーマンスを除いて正常に動作し、ユーザーに表示されるまでしばらくハングします。

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;
    }
}

それを呼び出すには、まず Initialize メソッドでインスタンスを作成します

frm = new RichTextBoxManager(richTextBox1.Document);

そして、テキストボックス(正規表現を置く場所)のtextchangeイベントで、Highlightメソッドを呼び出します

frm.Highlight(textBox1.Text);
4

1 に答える 1

0

これはまったく異なるアプローチですが、200,000 文字のファイルに対して 1 秒未満の応答で使用しています。

私はテキストから始めているので、これはあなたの選択肢ではないかもしれません.

テキスト ファイルの単語位置にインデックスを付けると、ユーザーは単語を検索できます。彼らが検索した単語をハイライトします。

ただし、テキストをループして FlowDoc を作成し、FlowDoc を作成するときに強調表示します。この FlowDoc には書式設定がありません (ハイライト以外)。したがって、フォーマットを保持する必要がある場合、これは機能しません。

だから私の推測では、TextPointer は多くのオーバーヘッドです。

しかし、私はあなたのコードから多くのことを学びました.

おそらく、最初の一致だけでなく、すべての一致を textRun で処理して位置をインクリメントすることを検討してください。

于 2012-06-05T21:27:26.123 に答える