編輯器的擴充點
編輯器會提供您可以擴充為管理擴充性架構 (MEF) 元件組件的擴充點。 這些是主要擴充點類別:
內容類型
分類類型及分類格式
邊界和捲軸
標記
裝飾
滑鼠的處理器
拖放處理常式
選項
IntelliSense
延伸的內容類型
內容類型是由編輯器] 中,例如文字、 「 文字 」、 「 代碼 」 或"將說明和 CSharp"的類型定義。 您定義新的內容型別宣告的型別變數ContentTypeDefinition ,並指定新的內容類型的唯一名稱。 若要登錄編輯器的內容類型,請將其匯出加上下列屬性:
NameAttribute為內容的型別名稱。
BaseDefinitionAttribute是這個內容型別衍生的內容類型名稱。 內容型別可能是繼承自多個其他內容類型。
因為ContentTypeDefinition密封的類別,您可以將其匯出具型別參數。
下列範例顯示在內容型別定義上的匯出屬性。
[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;
內容類型可以依據零或多個已存在的內容類型。 這些是內建的型別:
任何: 基本的內容類型。 所有其他內容類型的父代。
文字: 基本類型為非規劃的內容的。 繼承的"任何"。
純文字: 對於非程式碼的文字。 繼承自 「 文字 」。
程式碼: 所有種類的程式碼。 繼承自 「 文字 」。
Inert: 會排除任何一種處理中的文字。 此內容類型的文字絕對不會有其他套用至它的副檔名。
規劃: 為投影緩衝區的內容。 繼承的"任何"。
Intellisense: 為 IntelliSense 的內容。 繼承自 「 文字 」。
Sighelp: 簽章說明。 繼承自 「 intellisense"。
Sighelp 文件: 簽章的說明文件。 繼承自 「 intellisense"。
以下是某些內容由 Visual Studio 所定義的型別,以及部分裝載於 Visual Studio 的語言:
Basic
C/C + +
ConsoleOutput
CSharp
CSS
ENC
FindResults
F#
HTML
JScript
XAML
XML
若要找出可用的內容型別的清單,匯入IContentTypeRegistryService,保留內容的型別之集合,讓編輯器]。 下列程式碼匯入這項服務,做為屬性。
[Import]
internal IContentTypeRegistryService ContentTypeRegistryService { get; set; }
若要建立內容型別關聯的副檔名,請使用FileExtensionToContentTypeDefinition。
注意事項 |
---|
藉由使用登錄 Visual Studio 的檔案名稱副檔名ProvideLanguageExtensionAttribute的語言服務封裝上。FileExtensionToContentTypeDefinition MEF 的內容類型關聯以這種方式登錄的副檔名。 |
若要匯出檔案的副檔名到內容類型定義,您必須包含下列屬性:
FileExtensionAttribute: 指定的副檔名。
ContentTypeAttribute: 指定的內容類型。
因為FileExtensionToContentTypeDefinition密封的類別,您可以將其匯出具型別參數。
下列範例會顯示在內容型別定義的檔案名稱副檔名匯出屬性。
[Export]
[FileExtension(".test")]
[ContentType("test")]
internal static FileExtensionToContentTypeDefinition TestFileExtensionDefinition;
IFileExtensionRegistryService管理檔案的副檔名和內容的型別之間的關聯。
擴充類別的型別和分類將格式設定
您可以使用分類類型來定義您要提供不同的處理 (例如,色彩的藍色的 「 關鍵字 」 文字與"註解 」 文字的綠色) 的文字類型。 定義新的類別型別所宣告的型別變數ClassificationTypeDefinition ,並指定唯一的名稱。
若要登錄編輯器分類類型,請將其匯出加上下列屬性:
NameAttribute: 類別型別的名稱。
BaseDefinitionAttribute: 這個分類的型別所繼承的類別型別的名稱。 所有的類別型別繼承自 「 文字 」,而類別型別可能是繼承自多個其他類別型別。
因為ClassificationTypeDefinition密封的類別,您可以將其匯出具型別參數。
下列範例顯示分類的型別定義上的匯出屬性。
[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;
IStandardClassificationService提供標準的分類的存取。 內建的分類類型包括:
"text"
「 自然語言 」 (是衍生自 「 文字 」)
(衍生自 ["text")"正式語言 」
"string"(是衍生自 「 常值")
「 字元 」 (是衍生自 「 常值")
「 數值 」 (是衍生自 「 常值")
一組不同的錯誤型別繼承自ErrorTypeDefinition。 它們包含下列的錯誤類型:
「 語法錯誤 」
「 編譯器錯誤 」
「 其他錯誤 」
「 警告 」
若要找出可用的類別型別的清單,匯入IClassificationTypeRegistryService,保留類別型別的集合,讓編輯器]。 下列程式碼匯入這項服務,做為屬性。
[Import]
internal IClassificationTypeRegistryService ClassificationTypeRegistryService { get; set; }
您可以定義分類格式定義新的類別型別。 衍生類別從ClassificationFormatDefinition ,並將其匯出的型別EditorFormatDefinition,同時具有下列屬性:
NameAttribute: 格式的名稱。
DisplayNameAttribute: 顯示格式的名稱。
UserVisibleAttribute: 指定的格式是否出現在字型和色彩頁選項對話方塊。
OrderAttribute: 格式的優先順序。 有效值為從Priority。
ClassificationTypeAttribute: 這種格式對應型別分類的名稱。
下列範例顯示根據分類格式定義的匯出屬性。
[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = "test")]
[Name("test")]
[DisplayName("Test")]
[UserVisible(true)]
[Order(After = Priority.Default, Before = Priority.High)]
internal sealed class TestFormat : ClassificationFormatDefinition
若要找出可用格式的清單,匯入IEditorFormatMapService,保留格式集合編輯器。 下列程式碼匯入這項服務,做為屬性。
[Import]
internal IEditorFormatMapService FormatMapService { get; set; }
擴充的邊界和捲軸
邊界和捲軸是主要檢視的項目編輯器] 中,除了文字檢視表本身。 您可以提供任意數目的邊界中,除了 [文字] 檢視的周圍會出現標準邊界。
實作IWpfTextViewMargin來定義邊界的介面。 您也必須實作IWpfTextViewMarginProvider介面,以建立邊界。
若要向邊界提供者註冊編輯器,您必須匯出加上下列屬性提供者:
NameAttribute: 邊界的名稱。
OrderAttribute: 邊界顯示的順序,相對於其他的邊界。
這些都是內建的邊界:
「 Wpf 的水平捲軸 」
「 Wpf 的垂直捲軸 」
「 Wpf 的行號邊界"
有的順序屬性的水平邊界After="Wpf Horizontal Scrollbar"會顯示在下方的內建的邊界和有順序的屬性的水平邊界Before ="Wpf Horizontal Scrollbar"會顯示在上方的內建的邊界。 以滑鼠右鍵皆有的 [順序] 屬性的垂直邊界After="Wpf Vertical Scrollbar"捲軸的右側會隨即出現。 向左皆有的 [順序] 屬性的垂直邊界After="Wpf Line Number Margin"會顯示在左邊的列數字的邊界 (如果可以看到)。
MarginContainerAttribute: 一種 (左、 右、 上邊緣或下) 的邊界。
ContentTypeAttribute: 您的邊界是有效的 (比方說,「 文字 」 或 「 程式碼 」) 的內容類型。
下列範例會顯示上邊界提供者會顯示行數字邊界右方的邊界的匯出屬性。
[Export(typeof(IWpfTextViewMarginProvider))]
[Name("TestMargin")]
[Order(Before = "Wpf Line Number Margin")]
[MarginContainer(PredefinedMarginNames.Left)]
[ContentType("text")]
擴充的標記
標記是文字的一種關聯不同種類中的資料。 在許多情況下,相關聯的資料會顯示為視覺的效果,但並非所有標籤都有視覺化呈現。 您可以藉由實作定義您自己的類型的標籤ITag。 您也必須實作ITagger ,標記提供一組特定的文字的 span,和ITaggerProvider提供 tagger。 您必須匯出 tagger 提供者,加上下列屬性:
ContentTypeAttribute: 您的標籤是有效的 (比方說,「 文字 」 或 「 程式碼 」) 的內容類型。
TagTypeAttribute: 一種標記。
下列範例顯示於 tagger 提供者的匯出屬性。
[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TagType(typeof(TestTag))]
internal class TestTaggerProvider : ITaggerProvider
內建標籤下列幾種 ︰
ErrorTag: 錯誤的型別相關聯。
TextMarkerTag: 聯裝飾。
注意事項 如需範例的TextMarkerTag,請參閱 HighlightWordTag 在逐步解說: 反白顯示文字。
OutliningRegionTag: 和可展開或摺疊大綱區域相關聯。
SpaceNegotiatingAdornmentTag: 定義文字檢視中的裝飾佔用的空間。 如需有關空間交涉裝飾的詳細資訊,請參閱下一節。
IntraTextAdornmentTag: 提供自動調整大小間距和裝飾的調整大小。
要尋找及使用緩衝區和檢視表的標籤,匯入IViewTagAggregatorFactoryService或IBufferTagAggregatorFactoryService,這可讓您ITagAggregator的要求的型別。 下列程式碼匯入這項服務,做為屬性。
[Import]
internal IViewTagAggregatorFactoryService ViewTagAggregatorFactoryService { get; set; }
標記和 MarkerFormatDefinitions
您可以擴充MarkerFormatDefinition類別來定義標籤的外觀。 您必須匯出您的類別 (為EditorFormatDefinition) 具有下列屬性:
NameAttribute: 用來參考這種格式的名稱
UserVisibleAttribute: 這會導致在 UI 中顯示的格式
在建構函式,您可以定義顯示名稱和標籤的外觀。 BackgroundColor定義填滿色彩,以及ForegroundColor定義的框線色彩。 DisplayName是格式定義的當地語系化名稱。
格式定義的範例如下:
[Export(typeof(EditorFormatDefinition))]
[Name("MarkerFormatDefinition/HighlightWordFormatDefinition")]
[UserVisible(true)]
internal class HighlightWordFormatDefinition : MarkerFormatDefinition
{
public HighlightWordFormatDefinition()
{
this.BackgroundColor = Colors.LightBlue;
this.ForegroundColor = Colors.DarkBlue;
this.DisplayName = "Highlight Word";
this.ZOrder = 5;
}
}
若要套用此格式定義給標記,請參考您設定 name 屬性的類別 (而不是顯示名稱) 中的名稱。
注意事項 |
---|
如需範例的MarkerFormatDefinition,請參閱 HighlightWordFormatDefinition 類別,在逐步解說: 反白顯示文字。 |
擴充裝飾
裝飾定義可以加入至文字檢視中顯示的文字或文字檢視本身的視覺效果。 您可以做的任何型別來定義您自己的裝飾UIElement。
在裝飾類別中,您必須宣告AdornmentLayerDefinition。 若要註冊您的裝飾圖層,請將其匯出加上下列屬性:
NameAttribute: 裝飾名稱。
OrderAttribute: 相對於其他的裝飾層裝飾的順序。 類別PredefinedAdornmentLayers會定義四種預設階層: 選取項目、 大綱、 插入號,以及文字。
下列範例顯示裝飾層級定義的匯出屬性。
[Export]
[Name("TestEmbeddedAdornment")]
[Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)]
internal AdornmentLayerDefinition testLayerDefinition;
您必須建立第二個實作的類別, IWpfTextViewCreationListener ,並處理其TextViewCreated事件,藉由具現化的裝飾。 您必須匯出這個類別,加上下列屬性:
ContentTypeAttribute: 裝飾是有效的 (比方說,「 文字 」 或 「 程式碼 」) 的內容類型。
TextViewRoleAttribute: 這個裝飾是有效的文字檢視的類型。 類別PredefinedTextViewRoles有一組預先定義的文字檢視角色。 例如, Document主要用於文字檢視的檔案。 Interactive適用於使用者可以編輯,或使用滑鼠和鍵盤來瀏覽的文字檢視。 範例的Interactive檢視為編輯器的文字檢視方式,並輸出視窗。
下列範例會顯示匯出屬性裝飾的提供者。
[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("csharp")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class TestAdornmentProvider : IWpfTextViewCreationListener
空間交涉的裝飾是佔用的空間,做為文字相同層級。 若要建立這類的裝飾,您必須定義標記類別繼承自SpaceNegotiatingAdornmentTag,其中會定義裝飾佔用的空間數量。
就如同所有的按鈕,您必須匯出裝飾的層級定義。
[Export]
[Name("TestAdornment")]
[Order(After = DefaultAdornmentLayers.Text)]
internal AdornmentLayerDefinition testAdornmentLayer;
具現化空間交涉的裝飾,您必須建立一個類別,實作ITaggerProvider,除了實作的類別IWpfTextViewCreationListener (正如其他種類的裝飾)。
若要註冊的 tagger 提供者,您必須將它匯出加上下列屬性:
ContentTypeAttribute: 您裝飾是有效的 (比方說,「 文字 」 或 「 程式碼 」) 的內容類型。
TextViewRoleAttribute: 一種文字檢視,以及此標記或裝飾是否有效。 類別PredefinedTextViewRoles有一組預先定義的文字檢視角色。 例如, Document主要用於文字檢視的檔案。 Interactive適用於使用者可以編輯,或使用滑鼠和鍵盤來瀏覽的文字檢視。 範例的Interactive檢視為編輯器的文字檢視方式,並輸出視窗。
TagTypeAttribute: 一種標記或已定義的裝飾。 您必須加入第二個TagTypeAttribute的SpaceNegotiatingAdornmentTag。
下列範例顯示空間交涉裝飾標籤 tagger 提供者的匯出屬性。
[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(SpaceNegotiatingAdornmentTag))]
[TagType(typeof(TestSpaceNegotiatingTag))]
internal sealed class TestTaggerProvider : ITaggerProvider
擴充滑鼠處理器
您可以新增滑鼠輸入的特殊處理。 建立繼承自類別MouseProcessorBase而覆寫的輸入您想要處理的滑鼠事件。 您也必須實作IMouseProcessorProvider在第二個類別,並將其加上匯出ContentTypeAttribute ,指定您的滑鼠處理常式是有效的 (比方說,「 文字 」 或 「 程式碼 」) 的內容類型。
下列範例顯示於滑鼠處理器提供者的匯出屬性。
[Export(typeof(IMouseProcessorProvider))]
[Name("test mouse processor")]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
internal sealed class TestMouseProcessorProvider : IMouseProcessorProvider
擴充拖放處理常式
您可以自訂特定種類的文字的拖放處理常式的行為,藉由建立一個類別,實作IDropHandler和第二個實作的類別, IDropHandlerProvider建立拖放處理常式。 您必須匯出拖放處理常式,加上下列屬性:
DropFormatAttribute: 這個拖放處理常式是有效的 [文字] 格式。 依優先順序從最高額排到最低優先順序處理下列格式:
任何自訂的格式
FileDrop
EnhancedMetafile
WaveAudio
Riff
Dif
地區設定
Palette
PenData
可序列化
SymbolicLink
Xaml
XamlPackage
Tiff
點陣圖
Dib
MetafilePicture
CSV
System.String
HTML 格式
UnicodeText
OEMText
文字
NameAttribute: 拖放處理常式的名稱。
OrderAttribute: 排序拖放處理常式之前或之後的預設拖放處理常式。 Visual Studio 的預設拖放處理常式被命名為"DefaultFileDropHandler"。
下列範例顯示的拖放處理常式提供者上的匯出屬性。
[Export(typeof(IDropHandlerProvider))]
[DropFormat("Text")]
[Name("TestDropHandler")]
[Order(Before="DefaultFileDropHandler")]
internal class TestDropHandlerProvider : IDropHandlerProvider
擴充編輯器選項
您可以定義為只在特定範圍中,比方說,在文字檢視有效的選項。 在編輯器] 提供的這組預先定義的選項: 編輯器選項、 檢視選項],以及 Windows Presentation Foundation (WPF) 檢視選項。 這些選項位於DefaultOptions, DefaultTextViewOptions,以及DefaultWpfViewOptions。
若要新增新的選項,請從其中一個選項定義類別衍生一個類別:
下列範例會示範如何匯出選項定義具有布林值。
[Export(typeof(EditorOptionDefinition))]
internal sealed class TestOption : EditorOptionDefinition<bool>
擴充的 IntelliSense
IntelliSense 是一個通稱一群提供結構化的文字資訊的功能和它的陳述式完成。 這些功能包括陳述式完成、 簽章說明、 快速諮詢及智慧標籤。 陳述式完成可幫助使用者輸入正確的語言關鍵字或成員名稱。 使用者只要輸入方法的簽章的簽章,則會顯示簽章說明。 當滑鼠停留在其上時,快速諮詢就會顯示完整的簽章的型別或成員的名稱。 智慧標籤可以讓一個項目已重新命名後,重新命名所有的項目變數的特定內容,例如,特定識別項額外的動作。
IntelliSense 功能的設計是在所有情況下十分相似:
IntelliSense 保險經紀人負責整體的處理程序。
IntelliSense 工作階段代表之間的演講者的 committal 或取消選取範圍的觸發事件的順序。 某些使用者筆勢時通常會觸發工作階段。
IntelliSense 控制器負責決定該工作階段應該在何時開始和結束。 它也會決定何時應該認可的資訊和工作階段應該已取消。
IntelliSense 來源提供的內容,並決定最佳的相符項目。
IntelliSense 主持人負責顯示的內容。
在大部分的情況下,我們建議您提供至少一個來源和一個控制器。 您也可以提供主持人,如果您想要自訂顯示。
實作 IntelliSense 來源
若要自訂的來源,您必須實作其中一個 (或以上) 的下列來源介面:
此外,您必須實作相同類型的提供者:
您必須匯出的提供者加上下列屬性:
NameAttribute: 來源的名稱。
ContentTypeAttribute: 來源所套用的 (比方說,「 文字 」 或 「 程式碼 」) 的內容類型。
OrderAttribute: 來源 (相對於其他資源) 應出現的順序。
下列範例顯示完成來源提供者的匯出屬性。
Export(typeof(ICompletionSourceProvider))]
[Name(" Test Statement Completion Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestCompletionSourceProvider : ICompletionSourceProvider
如需有關如何實作 IntelliSense 來源的詳細資訊,請參閱下列的逐步解說:
實作 IntelliSense 控制器
若要自訂的控制器,您必須實作IIntellisenseController介面。 此外,您必須實作的控制站提供者,加上下列屬性:
NameAttribute: 控制站的名稱。
ContentTypeAttribute: 控制器所套用的 (比方說,「 文字 」 或 「 程式碼 」) 的內容類型。
OrderAttribute: 控制器 (相對於其他控制站) 應該出現的順序。
下列範例顯示在完成控制器提供者的匯出屬性。
Export(typeof(IIntellisenseControllerProvider))]
[Name(" Test Controller Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestIntellisenseControllerProvider : IIntellisenseControllerProvider
如需有關如何使用 IntelliSense 控制站的詳細資訊,請參閱下列逐步解說: