如何在不创建编辑器实例的情况下在MEF中使用IProjectionBuffer?

时间:2013-02-14 15:08:56

标签: visual-studio mef visual-studio-extensions

我正在尝试创建一个处理多语言内容类型的Visual Studio扩展。就像一些mvc-templates和Django或ASP.NET一样,代码的某些部分是另一种语言。

我知道我应该使用Projection,我已经检查了Django for Visual Studio extension但是那里的解决方案包括创建一个语言服务,并且遇到了创建与代码编辑器相关的所有零碎的麻烦。在这里,我试图通过使用MEF来实现相同的目标。

我知道您可以使用IProjectionBuffer CreateProjectionBuffer()创建投影,但问题是如何将当前的 TextBuffer 替换为创建的投影,何时是最佳时间。< / p>

如果他像这样指定“投影”类型的基本定义,也可以期待:

[Export]
[Name("Whatever")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition WhateverContentType = null;

提供者中收到的TextBuffer属于IProjectionBuffer类型(在所有IProjectionBuffer继承自ITextBuffer之后)。哪些,似乎投影基础定义没有任何影响。

所以,如果我想在tldr版本中重新解释我的问题:

如何以及何时将IProjectionBuffer应用于当前视图(使用MEF而不创建编辑器实例)?

1 个答案:

答案 0 :(得分:1)

因此,如果我正确理解你的问题,答案就是“你没有。” IWpfTextView在创建时绑定到ITextBuffer(或派生类型,如IProjectionBuffer)的实现,并且无法更改。即使你可以,许多其他扩展和语言服务也会对此感到非常惊讶,并且可能会崩溃。

要解决有关内容类型的第二个问题:只需声明基本内容类型为“投影”不会使您成为投影缓冲区。所有真正指出的是你可能正在创建那种类型的投影缓冲区,当你需要一些额外的ITagger支持时,标记器会像你期望的那样投射到源缓冲区。