2013-02-14 25 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

相關問題