在 Visual Studio 中,Office 开发工具提供类和设计器,这些工具帮助处理许多实现细节。当您在 VSTO 外接程序中使用它们来创建自定义任务窗格、功能区自定义和 Outlook 窗体区域时,这些细节将被自动处理。 但是,如果有特殊要求,还可以自行为每个功能实现 扩展性接口 。
适用于: 本主题中的信息适用于 VSTO 外接程序项目。 有关详细信息,请参阅 Office 应用程序和项目类型提供的功能。
Microsoft Office 定义了一组可由 COM VSTO 外接程序实现的扩展接口,以便自定义某些功能,例如功能区。 这些接口提供对其访问功能的完全控制。 但是,实现这些接口需要了解托管代码中的 COM 互作性。 在某些情况下,这些接口的编程模型对于习惯于 .NET Framework 的开发人员来说也不直观。
使用 Visual Studio 中的 Office 项目模板创建 VSTO 外接程序时,无需实现扩展性接口即可自定义功能区等功能。 Visual Studio Tools for Office 运行时为你实现这些接口。 相反,可以使用 Visual Studio 提供的更直观的类和设计器。 但是,如果需要,仍可以直接在 VSTO 外接程序中实现扩展性接口。
有关 Visual Studio 为这些功能提供的类和设计器的详细信息,请参阅 自定义任务窗格、 功能区设计器和 创建 Outlook 窗体区域。
可以在 VSTO 外接程序中实现的扩展性接口
下表列出了可以实现的扩展性接口以及支持它们的应用程序。
| 接口 | Description | Applications | 
|---|---|---|
| IRibbonExtensibility | 实现此接口以自定义功能区 UI。 注意: 可以将 Ribbon(XML) 项添加到项目中,以在 VSTO 外接程序中生成默认实现。 有关更多信息,请参阅 Ribbon XML。 | Excel InfoPath 2013 InfoPath 2010 展望 PowerPoint 项目 Visio 单词 | 
| ICustomTaskPaneConsumer | 实现此接口以创建自定义任务窗格。 | Excel 展望 PowerPoint 单词 | 
| FormRegionStartup | 实现此接口以创建 Outlook 窗体区域。 | 展望 | 
有几种其他扩展性接口由Microsoft Office 定义,例如 IBlogExtensibility, EncryptionProvider和 SignatureProvider。 Visual Studio 不支持在使用 Office 项目模板创建的 VSTO 外接程序中实现这些接口。
使用扩展性接口
若要使用扩展性接口自定义 UI 功能,请在 VSTO 外接程序项目中实现相应的接口。 然后,重写RequestService方法以返回一个实现接口的类的实例。
有关演示如何在适用于 Outlook 的 VSTO 加载项中实现 IRibbonExtensibility、ICustomTaskPaneConsumer 和 FormRegionStartup 接口的示例应用程序,请参阅 Office 开发示例中的 UI 管理器示例。
实现扩展性接口的示例
下面的代码示例演示了用于创建自定义任务窗格的接口的 ICustomTaskPaneConsumer 简单实现。 此示例定义了两个类:
- 该 - TaskPaneHelper类实现 ICustomTaskPaneConsumer 创建和显示自定义任务窗格。
- 该 - TaskPaneUI类提供任务窗格的 UI。 类的属性- TaskPaneUI使类对 COM 可见,这使Microsoft Office 应用程序能够发现该类。 在此示例中,UI 为空 UserControl,但可以通过修改代码来添加控件。- 注释 - 若要向 COM 公开 - TaskPaneUI类,还必须为项目设置 COM 互操作性注册 属性。- public class TaskPaneHelper : Office.ICustomTaskPaneConsumer { internal Office.CustomTaskPane taskPane; public void CTPFactoryAvailable(Office.ICTPFactory CTPFactoryInst) { if (CTPFactoryInst != null) { // Create a new task pane. taskPane = CTPFactoryInst.CreateCTP( "Microsoft.Samples.Vsto.CS.TaskPaneUI", "Contoso"); taskPane.Visible = true; } } } [System.Runtime.InteropServices.ComVisible(true)] [System.Runtime.InteropServices.ProgId("Microsoft.Samples.Vsto.CS.TaskPaneUI")] [System.Runtime.InteropServices.Guid("FFA0920E-F7A5-453d-8AB2-249F4C25B4B2")] public class TaskPaneUI : UserControl { }
有关ICustomTaskPaneConsumer的更多信息,请参阅 Microsoft Office 文档中的在 2007 版 Office 系统中创建自定义任务窗格。
重写 RequestService 方法的示例
下面的代码示例演示如何重写 RequestService 方法以从前面的代码示例返回类的 TaskPaneHelper 实例。 它会检查 serviceGuid 参数的值以确定正在请求哪个接口,然后返回实现该接口的对象。
internal TaskPaneHelper taskPaneHelper1;
protected override object RequestService(Guid serviceGuid)
{
    if (serviceGuid == typeof(Office.ICustomTaskPaneConsumer).GUID)
    {
        if (taskPaneHelper1 == null)
        {
            taskPaneHelper1 = new TaskPaneHelper();
        }
        return taskPaneHelper1;
    }
    return base.RequestService(serviceGuid);
}