Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这幅画装饰了两次?(Visual Studio扩展)_C#_.net_Visual Studio_Visual Studio Extensions - Fatal编程技术网

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()
方法。任何关于这方面的处罚。要求一行文字可能是罚款。它至少比获取整个文件的文本要好得多,而整个文件的大小很容易达到兆字节。