编辑器提供扩展点可以扩展为 managed extensibility framework 组件。 (MEF) 这些是主扩展点类别:
内容类型
分类类型和类别格式
边距和滚动
标记
修饰
鼠标处理器
放置处理程序
选项
IntelliSense
扩展的内容类型
内容类型为编辑器处理文本类型的定义,例如, “文本”, “代码”或 “CSharp”。 通过声明类型 ContentTypeDefinition 的变量并使新内容类型指定一个唯一的名称定义一个新内容类型。 向注册编辑器的内容类型,具有下列特性。它导出:
NameAttribute 是该内容类型的名称。
BaseDefinitionAttribute 是此内容类型派生内容类型的名称。 内容类型可以从多个继承其他内容类型。
由于 ContentTypeDefinition 类密封,可以导出它没有类型参数。
下面的示例演示导出在内容类型定义的属性。
[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;
内容类型可基于零个或多个预先存在的内容类型。 这些是内置类型:
任何:基本的内容类型。 其他内容类型的父级。
文本:非投影内容的基本类型。 从 “任何”继承。
纯文本:对非代码文本。 从 “text”继承。
代码:为所有类型的代码。 从 “text”继承。
插入内容:从任何处理排除该文本。 此内容类型文本不会有任何扩展应用于它。
投影:对投影缓冲区内容。 从 “任何”继承。
Intellisense:向 IntelliSense 内容。 从 “text”继承。
Sighelp:签名帮助。 从 “intellisense”继承。
Sighelpdoc:签名帮助文档。 从 “intellisense”继承。
这些是由 Visual Studio 定义 Visual Studio 中承载的某些内容类型和某些语言:
基本
C/C++
ConsoleOutput
CSharp
CSS
ENC
FindResults
F#
HTML
JScript
XAML
XML
若要查看可用内容类型的列表,请导入 IContentTypeRegistryService,保留内容类型的集合编辑器的。 下面的代码导入此服务为特性。
[Import]
internal IContentTypeRegistryService ContentTypeRegistryService { get; set; }
若要将某个内容类型与文件扩展名,请使用 FileExtensionToContentTypeDefinition。
备注
通过在语言服务包,的 ProvideLanguageExtensionAttribute 在 Visual Studio 中,文件扩展名注册。FileExtensionToContentTypeDefinition 关联 MEF 内容类型与此注册的文件扩展名。
对该内容类型定义若要导出文件扩展名,必须包括以下属性:
FileExtensionAttribute:指定文件扩展名。
ContentTypeAttribute:指定该内容类型。
由于 FileExtensionToContentTypeDefinition 类密封,可以导出它没有类型参数。
下面的示例演示一个内容类型定义导出对文件扩展名的属性。
[Export]
[FileExtension(".test")]
[ContentType("test")]
internal static FileExtensionToContentTypeDefinition TestFileExtensionDefinition;
IFileExtensionRegistryService 管理对文件扩展名与内容类型之间的关联。
扩展的分类类型和类别格式
可以使用分类类型定义 (例如要提供其他处理。 (文本,则以 “关键字” text " 和 “注释”文本绿色)。 通过声明类型 ClassificationTypeDefinition 的变量并为其赋予一个唯一名称定义新的分类类型。
为类别键入与编辑器中注册,请使用以下属性。它导出:
NameAttribute:分类类型的名称。
BaseDefinitionAttribute:此分类类型继承分类类型的名称。 所有分类类型从 “text”继承,因此,类类型可以从多个继承其他分类类型。
由于 ClassificationTypeDefinition 类密封,可以导出它没有类型参数。
下面的示例演示在导出类类型定义的属性。
[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;
IStandardClassificationService 提供对标准分类。 内置类别类型包括:
“text”
“自然语言” (从 “text”派生)
“specification language” (从 “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 为给定提供标记为文本范围和 ITaggerProvider 提供该标记。 您必须具有以下属性。导出标记提供程序:
ContentTypeAttribute:此目录 (例如, “文本”或 “代码”) 您的标记是否有效。
TagTypeAttribute:此标记。
下面的示例演示导出在标记提供程序的特性。
[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;
}
}
若要将此格式定义于标记,引用您在类的名称 (不是显示名称) 的命名属性设置为。
备注
有关 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 (与其他修饰)。
注册标记提供程序,您必须具有以下属性。它导出:
ContentTypeAttribute:此目录 (例如, “文本”或 “代码”) 您的修饰是有效的。
TextViewRoleAttribute:将此标记或修饰有效的文本视图。 类 PredefinedTextViewRoles 有一组预定义文本视图角色。 例如, Document 为文件文本视图主要用途。 Interactive 用于通过使用鼠标和键盘,用户可以编辑或导航的文本视图使用。 Interactive 视图的示例是编辑文本视图和 输出 窗口。
TagTypeAttribute:您定义的此标记或修饰。 必须将 SpaceNegotiatingAdornmentTag在一秒钟 TagTypeAttribute 。
在标记提供程序的下面的示例演示导出特性空白之间协调修饰的标记。
[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
即兴重复段
Dif
区域设置
调色板
PenData
可序列化
SymbolicLink
XAML
XamlPackage
TIFF
位图
DIB
MetafilePicture
CSV
System.String
HTML 格式
UnicodeText
OEMText
text
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 会话 表示事件顺序在选定内容触发此呈现器和受信任或取消之间的。 会议由某用户笔势通常触发。
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 控制器的更多信息,请参见以下演练: