为什么这张图要装饰两次? (Visual Studio 分机)
Why is this drawing Adornments twice? (Visual Studio Extension)
我正在创建一个扩展,围绕某些标记绘制装饰,并想出了下面的代码。只要代码在一行上,它就可以正常工作。只要我添加一个新行,装饰就会在每次按键或滚动时重复绘制在现有装饰之上(LayoutChanged
事件)。
我可能做错了什么?另外,我自己想出了下面的代码,所以可能存在根本性的错误。
private void CreateVisuals(ITextViewLine line)
{
var textViewLines = _wpfTextView.TextViewLines;
var text = line.Snapshot.GetText();
//var text = textViewLines.FormattedSpan.Snapshot.GetText();
var todoRegex = new Regex(@"\/\/\s*TODO\b");
var match = todoRegex.Match(text);
while (match.Success)
{
var matchStart = match.Index;
var span = new SnapshotSpan(_wpfTextView.TextSnapshot, Span.FromBounds(matchStart, matchStart + match.Length));
DrawAdornment(textViewLines, span);
match = match.NextMatch();
}
}
因此,如果您在 LayoutChanged
期间添加装饰,则只需为正在布置的文本添加装饰。您可以从 TextViewLayoutChangedEventArgs.NewOrReformattedLines
中获取正在重新布置的线路列表。如果您通过 VSSDK 模板创建新的文本装饰,您将看到它是如何完成的。
只要编辑器需要对某些行进行布局,就会引发 LayoutChanged
事件,但并不总是需要对所有行进行布局。例如,滚动时,它只需要计算滚动到视图中的行的布局。如果您 insert/delete 行,则其他向上或向下移动的行也不必重新布置。
(与您的问题无关但仍然很重要:调用 ITextSnapshot.GetText() 非常慢。如果您打开了 multi-megabyte 文件,这将需要我们分配一个字符串,它会非常慢。实际上,GetText() 应该只用于调试。如果您正在寻找 TODO 注释,并且可以将其限制为 C# 或 Visual Studio 中的 VB 代码2015 年,你真的应该看看 Roslyn,它可以让你访问语法树信息。)
我正在创建一个扩展,围绕某些标记绘制装饰,并想出了下面的代码。只要代码在一行上,它就可以正常工作。只要我添加一个新行,装饰就会在每次按键或滚动时重复绘制在现有装饰之上(LayoutChanged
事件)。
我可能做错了什么?另外,我自己想出了下面的代码,所以可能存在根本性的错误。
private void CreateVisuals(ITextViewLine line)
{
var textViewLines = _wpfTextView.TextViewLines;
var text = line.Snapshot.GetText();
//var text = textViewLines.FormattedSpan.Snapshot.GetText();
var todoRegex = new Regex(@"\/\/\s*TODO\b");
var match = todoRegex.Match(text);
while (match.Success)
{
var matchStart = match.Index;
var span = new SnapshotSpan(_wpfTextView.TextSnapshot, Span.FromBounds(matchStart, matchStart + match.Length));
DrawAdornment(textViewLines, span);
match = match.NextMatch();
}
}
因此,如果您在 LayoutChanged
期间添加装饰,则只需为正在布置的文本添加装饰。您可以从 TextViewLayoutChangedEventArgs.NewOrReformattedLines
中获取正在重新布置的线路列表。如果您通过 VSSDK 模板创建新的文本装饰,您将看到它是如何完成的。
只要编辑器需要对某些行进行布局,就会引发 LayoutChanged
事件,但并不总是需要对所有行进行布局。例如,滚动时,它只需要计算滚动到视图中的行的布局。如果您 insert/delete 行,则其他向上或向下移动的行也不必重新布置。
(与您的问题无关但仍然很重要:调用 ITextSnapshot.GetText() 非常慢。如果您打开了 multi-megabyte 文件,这将需要我们分配一个字符串,它会非常慢。实际上,GetText() 应该只用于调试。如果您正在寻找 TODO 注释,并且可以将其限制为 C# 或 Visual Studio 中的 VB 代码2015 年,你真的应该看看 Roslyn,它可以让你访问语法树信息。)