1

这是一个有点异国情调的问题,但无论如何我都会尝试。

我正在使用 MEF 编写 Visual Studio 2010 扩展。在我的代码中的某个时刻,每当保存文档时,我都需要提供一些错误字形(如刹车点)。问题是,如果不让用户写任何东西,我似乎无法找到如何强制调用GetTags我的方法。ITagger

我可以捕获文档保存事件,但我错过了这之间的“链接”,并以某种方式获取GetTags要调用的方法。有任何想法吗?

这是一些代码:

internal class RTextErrorTag : IGlyphTag
    {}

    class RTextErrorGlyphTagger : ITagger<RTextErrorTag>
    {
        private IClassifier mClassifier;
        private SimpleTagger<ErrorTag> mSquiggleTagger;
        private EnvDTE._DTE mMSVSInstance = null;
        private List<object> mDTEEvents = new List<object>();

        internal RTextErrorGlyphTagger(IClassifier classifier, IErrorProviderFactory squiggleProviderFactory, ITextBuffer buffer, IServiceProvider serviceProvider)
        {
            this.mClassifier = classifier;
            this.mSquiggleTagger = squiggleProviderFactory.GetErrorTagger(buffer);
            mMSVSInstance = serviceProvider.GetService(typeof(EnvDTE._DTE)) as EnvDTE._DTE;
            var eventHolder = mMSVSInstance.Events.DocumentEvents;
            mDTEEvents.Add(eventHolder);
            eventHolder.DocumentSaved += new EnvDTE._dispDocumentEvents_DocumentSavedEventHandler(OnDocumentSaved);
        }

        void OnDocumentSaved(EnvDTE.Document Document)
        {
            //fire up event to renew glyphs - how to force GetTags method?
            var temp = this.TagsChanged;
            if (temp != null)
                temp(this, new SnapshotSpanEventArgs(new SnapshotSpan() )); //how to foce get
        }

        IEnumerable<ITagSpan<RTextErrorTag>> ITagger<RTextErrorTag>.GetTags(NormalizedSnapshotSpanCollection spans)
        {
            foreach (SnapshotSpan span in spans)
            {
                foreach (var error in this.mSquiggleTagger.GetTaggedSpans(span))
                {
                    yield return new TagSpan<RTextErrorTag>(new SnapshotSpan(span.Start, 1), new RTextErrorTag());
                }
            }
        }

        public event EventHandler<SnapshotSpanEventArgs> TagsChanged; 
    }
4

0 回答 0