C# 为什么这幅画装饰了两次?(Visual Studio扩展)
我正在创建一个扩展,它围绕某些标记绘制装饰,并产生了下面的代码。只要代码在一行上,它就可以正常工作。只要我添加一条新线,就会在每次按键或滚动(C# 为什么这幅画装饰了两次?(Visual Studio扩展),c#,.net,visual-studio,visual-studio-extensions,C#,.net,Visual Studio,Visual Studio Extensions,我正在创建一个扩展,它围绕某些标记绘制装饰,并产生了下面的代码。只要代码在一行上,它就可以正常工作。只要我添加一条新线,就会在每次按键或滚动(LayoutChangedevent)时,在现有装饰的基础上重复绘制装饰 我可能做错了什么?另外,我自己也想出了下面的代码,所以可能有一些根本性的错误 private void CreateVisuals(ITextViewLine line) { var textViewLines = _wpfTextView.TextViewLines;
LayoutChanged
event)时,在现有装饰的基础上重复绘制装饰
我可能做错了什么?另外,我自己也想出了下面的代码,所以可能有一些根本性的错误
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.new或reformatedLines
中获取要关联的行列表。如果您通过VSSDK模板创建一个新的文本装饰,您将看到这是如何完成的
每当编辑器需要布局某些行时,都会引发LayoutChanged
事件,但并不总是必须布局所有行。例如,当滚动时,它只需要计算滚动到视图中的行的布局。如果插入/删除行,也不必重新标记上下移动的其他行
(与您的问题无关,但仍然很重要:调用ITextSnapshot.GetText()的速度非常慢。如果您打开了一个多兆字节的文件,这将需要我们分配一个非常慢的字符串。实际上,GetText()应该只用于调试。如果您正在查找TODO注释,并且您可以在Visual Studio 2015中将其限制为C#或VB代码,那么您真的应该查看Roslyn,它可以让您访问语法树信息。)非常感谢。它解决了这个问题!但是我仍然只在
new或reformatedlines
中的行上使用ITextViewLine.Extent.GetText()
方法。任何关于这方面的处罚。要求一行文字可能是罚款。它至少比获取整个文件的文本要好得多,而整个文件的大小很容易达到兆字节。