AvalonEdit で選択した単語のすべてのインスタンスをハイライト
AvalonEditで選択された単語のすべてのインスタンスを強調表示するには、次の手順を使用してください。
- 現在選択中の単語を取得します:
string selectedWord = editor.SelectedText;
- 選択された単語のインスタンスを検索してハイライトするには、正規表現を使用します。次のコードをEditorのSelectionChangedイベントハンドラに追加できます。
// 清除先前的突出显示
editor.TextArea.TextView.LineTransformers.Clear();
// 使用正则表达式搜索所选单词的实例并添加突出显示器
Regex regex = new Regex("\\b" + Regex.Escape(selectedWord) + "\\b");
MatchCollection matches = regex.Matches(editor.Text);
foreach (Match match in matches)
{
int startOffset = editor.Document.GetOffset(match.Index);
int endOffset = editor.Document.GetOffset(match.Index + match.Length);
editor.TextArea.TextView.LineTransformers.Add(new HighlightingColorizer(startOffset, endOffset));
}
// 触发重新渲染以显示突出显示
editor.TextArea.TextView.Redraw();
- 指定された範囲を強調表示するために、カスタムのHighlightingColorizerクラスを作成する。
public class HighlightingColorizer : DocumentColorizingTransformer
{
private readonly int _startOffset;
private readonly int _endOffset;
public HighlightingColorizer(int startOffset, int endOffset)
{
_startOffset = startOffset;
_endOffset = endOffset;
}
protected override void ColorizeLine(DocumentLine line)
{
if (_startOffset > line.EndOffset || _endOffset < line.Offset)
return;
int start = Math.Max(_startOffset, line.Offset);
int end = Math.Min(_endOffset, line.EndOffset);
base.ChangeLinePart(start, end, (VisualLineElement element) =>
{
element.TextRunProperties.SetForegroundBrush(Brushes.Yellow);
});
}
}
上コードは選択された単語を本文中の単語と照合し、見つかった単語の出現部分を強調表示します。ここで使用している正規表現は簡単なもので、単語全体との照合です。より複雑な照合パターンが必要な場合は、必要に応じて修正してください。
前景表示パネルを追加する前に、前の前景表示パネルを必ず削除してください。そうしないと、競合や前景表示パネルの重複が生じる可能性があります。