Visual Studio SDK - 如何在调用的命令上添加边距字形?

时间:2015-08-26 11:33:54

标签: visual-studio-extensions vsix vs-extensibility visual-studio-sdk

如何修改此示例:https://msdn.microsoft.com/en-us/library/ee361745.aspx如果点击我添加的按钮时将边框添加到边距?

我有一个按钮,可以创建一种特殊的断点。我想通过我自己的边缘字形识别这种类型。所以我在Tagger类中编写了GetTags方法,如下所示:

    IEnumerable<ITagSpan<MyBreakpointTag>> ITagger<MyBreakpointTag>.GetTags(NormalizedSnapshotSpanCollection spans)
    {
        if (BreakpointManager != null)
        {
            DTE2 ide = ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE2;
            Document document = ide.ActiveDocument;

            foreach (SnapshotSpan span in spans)
            {
                ITextSnapshot textSnapshot = span.Snapshot;
                foreach (ITextSnapshotLine textSnapshotLine in textSnapshot.Lines)
                {
                    if (BreakpointManager.IsMyBreakpointAt(document.FullName, textSnapshotLine.LineNumber + 1))
                    {
                        yield return new TagSpan<MyBreakpointTag>(new SnapshotSpan(textSnapshotLine.Start, 1),
                                new MyBreakpointTag());
                    }
                }
            }
        }
    }

但是,在将光标移动到不同的代码行或更改代码后添加字形。在点击按钮后立即添加字形我该怎么做?

2 个答案:

答案 0 :(得分:2)

每当布局发生时,编辑器都会调用GetTags,但编辑器不会因任何随机原因而调用它。 (想一想:怎么知道什么时候打电话给你?)你需要从你的标签器中提出TagsChanged事件来说明给定跨度的标签发生了变化,然后再次调用GetTags进行刷新。

作为一条不相关的建议:您不应该在GetTags中使用DTE.ActiveDocument,原因如下:

  1. GetTags应该尽可能快......调用DTE方法很快就会很快。
  2. 想象一下,您打开了两个文件,并为非活动文件调用了GetTags。这将有两个文件查看相同的文件名,这可能是坏的。代码here显示了如何从ITextBuffer中获取文件名。

答案 1 :(得分:0)

这是从我的回答here复制的。基本上,从使用ITaggerProvider更改为IViewTaggerProvider允许我重绘字形。我使用了Walkthrough: Displaying Matching Braces示例中的实现大括号匹配标记提供程序部分来进行这些更改。

使用IViewTaggerProvider,您可以调用

TagsChanged?.Invoke(this, new SnapshotSpanEventArgs(
                              new SnapshotSpan(
                                      SourceBuffer.CurrentSnapshot,
                                      0, 
                                      SourceBuffer.CurrentSnapshot.Length)));

在您的函数中显式调用GetTags并遍历当前快照中的跨度。