2013-02-14 26 views
1

我想创建一个处理多语言内容类型的Visual Studio扩展。很像mvc模板和Django或ASP.NET,其中某些代码的一部分是用另一种语言编写的。如何在不创建编辑器实例的情况下在MEF中使用IProjectionBuffer?

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

我知道,你可以使用IProjectionBuffer CreateProjectionBuffer()创建的投影,但问题是如何以取代目前的TextBuffer与所生成的一个,当是做的最好时机。

同样可以预期,如果他指定类型的基极定义“投影”是这样的:

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

所接收TextBuffer在提供商是IProjectionBuffer型的(所有IProjectionBuffer从ITextBuffer继承之后)。这是而不是,似乎投影基地定义没有任何效果。

所以,如果我要改写在tldr版本我的问题:

如何以及何时你申请的IProjectionBuffer当前视图(使用MEF,并不会产生一个编辑器实例)?

回答

1

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

要解决关于内容类型的第二个问题:简单地声明基本内容类型为“投影”不会使您成为投影缓冲区。所有真正说明的是,您可能正在创建该类型的投影缓冲区,并且当您需要某些额外的ITagger支持时,标记器会按照您预期的那样投影到源缓冲区。

+0

是否有可能以某种方式添加到源缓冲区集合? – jwize 2014-04-13 05:52:45

+0

您可以使用InsertSpans/RemoveSpans或其他内容添加/删除单个跨度。源缓冲区是根据它自动计算的。如果您还有其他问题,最好从头开始创建一个新问题。 – 2014-04-17 02:28:59

相关问题