ExpansionProvider 类

提供用于插入代码段支持到源代码。

此 API 不兼容 CLS。 

继承层次结构

System.Object
  Microsoft.VisualStudio.Package.ExpansionProvider

命名空间:  Microsoft.VisualStudio.Package
程序集:   Microsoft.VisualStudio.Package.LanguageService.10.0(在 Microsoft.VisualStudio.Package.LanguageService.10.0.dll 中)
  Microsoft.VisualStudio.Package.LanguageService(在 Microsoft.VisualStudio.Package.LanguageService.dll 中)
  Microsoft.VisualStudio.Package.LanguageService.9.0(在 Microsoft.VisualStudio.Package.LanguageService.9.0.dll 中)
  Microsoft.VisualStudio.Package.LanguageService.11.0(在 Microsoft.VisualStudio.Package.LanguageService.11.0.dll 中)

语法

声明
<CLSCompliantAttribute(False)> _
<ComVisibleAttribute(True)> _
Public Class ExpansionProvider _
    Implements IDisposable, IVsExpansionClient
[CLSCompliantAttribute(false)]
[ComVisibleAttribute(true)]
public class ExpansionProvider : IDisposable, 
    IVsExpansionClient

ExpansionProvider 类型公开以下成员。

构造函数

  名称 说明
公共方法 ExpansionProvider 初始化 ExpansionProvider 类的新实例。

页首

属性

  名称 说明
公共属性 Expansion 返回用于插入代码段使用的 IVsExpansion 对象到缓冲区中。
公共属性 ExpansionSession 返回已创建的外接会话管理编辑代码段。
公共属性 InTemplateEditingMode 指示代码段当前是否正在编辑。
公共属性 Source 返回 Source 对象与此扩展提供程序。
公共属性 TextView 返回包含源文件的文本视图后操作外接程序。

页首

方法

  名称 说明
公共方法 BeginTemplateEditing 插入以前准备的代码段并开始编辑模式的代码段。
公共方法 DisplayExpansionBrowser 显示指定的类型和类型的展开模板列表。
公共方法 Dispose ,在销毁之前,清理已分配的资源 ExpansionProvider 对象。
公共方法 EndExpansion 调用中,展开会话关闭时。
公共方法 EndTemplateEditing 关闭编辑模式的当前代码段。
公共方法 Equals 确定指定的对象是否等于当前对象。 (继承自 Object。)
受保护的方法 Finalize ,在销毁之前,清理所有资源 ExpansionProvider 对象。 (重写 Object.Finalize()。)
公共方法 FindExpansionByShortcut 获取给定的代码段的路径和标题代码段的快捷方式名称。
公共方法 FormatSpan 格式说明符的文本范围。
公共方法 GetExpansionFunction(XmlElement, String) 返回表示外接功能的 IVsExpansionFunction 对象描述在特定 XML 模板节点。
公共方法 GetExpansionFunction(IXMLDOMNode, String, IVsExpansionFunction%) 返回表示外接功能的 IVsExpansionFunction 对象描述在特定 XML 模板节点 (COM 实现)。
公共方法 GetExpansionSpan 返回此代码段占用的大小当前编辑。
公共方法 GetFieldSpan 获取指定的字段的大小
公共方法 GetFieldValue 返回指定字段的值。
公共方法 GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
公共方法 GetType 获取当前实例的 Type。 (继承自 Object。)
公共方法 HandlePostExec 调用,在命令执行后。
公共方法 HandlePreExec 调用命令之前执行。
公共方法 HandleQueryStatus 确定指定的命令是由 ExpansionProvider 类处理。
公共方法 InsertNamedExpansion 指定插入的代码段添加到源中特定位置。
公共方法 InsertSpecificExpansion 插入给定代码段添加到源中指定的位置。
公共方法 IsValidKind 确定是否为扩展的有效的文本。此方法,则位置。若要指定源文档展开会出现,应重写。
公共方法 IsValidType 确定特定类型是否为外接用途有效。此方法,则位置。若要指定源文档展开会出现,应重写。
受保护的方法 MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。)
公共方法 OnAfterInsertion 调用,在代码段插入到数据源后。
公共方法 OnBeforeInsertion 对该代码段之前插入到该数据源。
公共方法 OnItemChosen 调用,该项目在代码段浏览器中选择。
公共方法 PositionCaretForEditing 在位置放置脱字号适用于。
公共方法 PrepareTemplate 对指定的代码段插入准备。
公共方法 ToString 返回表示当前对象的字符串。 (继承自 Object。)

页首

备注

代码段是展开到完整代码,当用户插入代码段时的模板。 当该代码段先展开时,输入特定模板编辑器可以就地修改代码段架构的 Visual Studio 核心编辑器。 即该代码段的某些部分被指定为字段,并且,这些字段可以由用户轻松地更改,在代码段提交编辑缓冲区之前。 字段显示并且可以以提供选择的下拉框中的功能对用户。

代码段都有一个标识的名称并包含此代码段的模板文件。 模板文件包含表示模板的特定元素 XML 标记,从代码来替换域的功能 (,称为外接函数)。 有关更多详细信息参见 代码段 在代码段。

对实现者的说明

ExpansionProvider 类用于选择和插入代码段提供任何支持到源文件。 基类提供所有基本功能;但是,因此,如果要支持上下文相关代码段插入 (即同名的一个代码段可能会根据其插入) 的上下文的行为不同,则必须从 ExpansionProvider 类派生类并重写在特定上下文允许的 IsValidTypeIsValidKind 方法报告适当的代码段类型和类型。 请确保重写在 LanguageService 类版本的 CreateExpansionProvider 方法返回 ExpansionProvider 类的版本。

对调用者的说明

ExpansionProvider 类的实例从在从在 Source 类的 GetExpansionProvider 方法调用的 LanguageService 类的 CreateExpansionProvider 方法返回。 ViewFilter 类又调用转发到 GetExpansionProvider 方法的调用在 Source 类自己的 GetExpansionProvider 。 ,在其上执行命令提供 ExpansionProvider 类机会操作后, ViewFilter 类调用 GetExpansionProvider 方法。

示例

展开在三种方式插入:

  1. 代码段浏览器,

  2. 选择代码段的快捷方式名称从完成列表或

  3. 通过键入快捷方式和输入完成字符 (如选项或空格。

下面的示例演示一种通过键入键后按 tab 键来展开快捷方式触发的可自动处理展开。 ,在 tab 键类型化时,调用此方法。

using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio;

namespace MyLanguagePackage
{
    class MyViewFilter : ViewFilter
    {
        // This is called from our HandlePreExec when a tab key is pressed
        bool HandleTabKey()
        {
            ExpansionProvider ep = GetExpansionProvider();
            if (ep == null || ep.InTemplateEditingMode)
            {
                // No expansion provider or already editing a template,
                // so nothing to do.
                return false;
            }

            TokenInfo tokenInfo = Source.GetTokenInfo(TextView);
            if (tokenInfo.StartLine != tokenInfo.EndLine ||
                tokenInfo.StartIndex == tokenInfo.EndIndex)
            {
                // No shortcut found before caret, so nothing to do.
                // Note that the above test does not allow for single
                // character tokens to be shortcut names.
                return false;
            }

            int line;
            int col;
            int hr;
            hr = TextView.GetCaretPos(out line,out col);
            if (hr != VsConstants.S_OK)
            {
                // Could not get current position, so nothing to do.
                // GetCaretPos is used in Source.GetTokenInfo so if
                // GetCaretPos fails, GetTokenInfo fails. However,
                // better to be thorough and test again here.
                return false;
            }

            // Get shortcut text that was just typed.
            string shortcut = Source.GetText(line,
                                             tokenInfo.StartIndex,
                                             line,
                                             tokenInfo.EndIndex);
            if (shortcut == null || shortcut == "")
            {
                // No text was found at the position. This failure is
                // is not likely if GetTokenInfo returned a valid token
                // but better to be thorough.
                return false;
            }

            string snippetTitle;
            string snippetPath;
            TextSpan pos = new TextSpan();
            pos.iStartLine = line;
            pos.iStartIndex = tokenInfo.StartIndex;
            pos.iEndLine = line;
            pos.iEndIndex = tokenInfo.EndIndex;
            if (ep.FindExpansionByShortcut(TextView,
                                            shortcut,
                                            pos,
                                            true,
                                            out title,
                                            out path) != VSConstants.S_OK)
            {
                // No snippet matched the shortcut, so nothing to do.
                return false;
            }

            // If InsertNamedExpansion returns true, snippet was
            // inserted and therefore the Tab key was handled.
            // Otherwise, false is returned and the Tab key will be
            // passed on to someone else.
            return ep.InsertNamedExpansion(TextView,
                                           title,
                                           path,
                                           pos,
                                           false);
        }
    }
}

线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

请参见

参考

Microsoft.VisualStudio.Package 命名空间

其他资源

代码段

代码段架构参考