C# ITagAggregator<;T>;。塔格桑吉德永远不会被解雇
我有相当简单的TagProvider,我想通过我的定制装饰来使用它。这一切都很好,除了挂在TagsChange事件 下面是我用来获取标签服务工厂的代码:C# ITagAggregator<;T>;。塔格桑吉德永远不会被解雇,c#,mef,C#,Mef,我有相当简单的TagProvider,我想通过我的定制装饰来使用它。这一切都很好,除了挂在TagsChange事件 下面是我用来获取标签服务工厂的代码: [Import] internal IViewTagAggregatorFactoryService AggregatorService = null; ... MyTagAggregator = AggregatorService.CreateTagAggregator<MyTag>(View); MyTagAggr
[Import]
internal IViewTagAggregatorFactoryService AggregatorService = null;
...
MyTagAggregator = AggregatorService.CreateTagAggregator<MyTag>(View);
MyTagAggregator.TagsChanged += MyTagAggregator_TagsChanged;
[导入]
内部IViewTagAggregatorFactoryService AggregatorService=null;
...
MyTagAggregator=AggregatorService.CreateTaggregator(视图);
MyTagAggregator.TagsChanged+=MyTagAggregatoru TagsChanged;
但MyTagAggregator_TagsChanged委托从未被激发。我尝试了不同类型的标签,有些是定制的,有些是内置的(例如SmartTag)
我是否遗漏了什么,是否应该在使用此事件之前设置其他内容?经过一些研究,我找到了问题所在 AggregatorService.CreateTaggregator方法将调用IViewTaggerProvider.CreateTaggregator方法。在我的例子中,实现是这样的:
[Export(typeof(IViewTaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(MyTag))]
internal class MyTaggerProvider : IViewTaggerProvider
{
public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag
{
return new MyTagger(this) as ITagger<T>;
}
}
[导出(类型(IViewTaggerProvider))]
[内容类型(“文本”)]
[TextViewRole(预定义的textViewRoles.Document)]
[TagType(typeof(MyTag))]
内部类MyTaggerProvider:IViewTaggerProvider
{
公共ITagger CreateTagger(ITextView textView,ITextBuffer buffer),其中T:ITag
{
将新的MyTagger(this)返回为ITagger;
}
}
这将始终返回TagAggregator的新实例。所以,当我在一个例子中改变了一些东西,它自然不会影响到其他人。解决方案是利用TextView上的Properties属性,因此后续每次调用都将返回特定TextView的相同实例:
[Export(typeof(IViewTaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(MyTag))]
internal class MyTaggerProvider : IViewTaggerProvider
{
public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag
{
return TextView.Properties.GetOrCreateSingletonProperty(delegate() { return new MyTagger(this); }) as ITagger<T>;
}
}
[导出(类型(IViewTaggerProvider))]
[内容类型(“文本”)]
[TextViewRole(预定义的textViewRoles.Document)]
[TagType(typeof(MyTag))]
内部类MyTaggerProvider:IViewTaggerProvider
{
公共ITagger CreateTagger(ITextView textView,ITextBuffer buffer),其中T:ITag
{
返回TextView.Properties.GetOrCreateSingletonProperty(委托(){返回新的MyTagger(this);})作为ITagger;
}
}
请在您的描述中添加一段代码,您可以在其中实例化您的聚合器服务,它已经存在了。AggregatorService由VS服务初始化。初始化没有问题,CreateTagAggregator方法正在工作,我正在获取对MyTagAggregator的引用,同时设置委托工作,但事件从未触发。在我看到的大多数例子中,这已经足够了。