正規表現パターンに従って 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);