使用扩展性接口自定义 UI 功能
Visual Studio 中的 Office 开发工具提供了一些类和设计器,使用它们在 VSTO 外接程序中创建自定义任务窗格、功能区自定义项和 Outlook 窗体区域时可处理许多实现细节。 不过,如果你有特殊要求,也可以自己为每项功能实现 扩展性接口 。
适用于: 本主题中的信息适用于 VSTO 外接程序项目。 有关详细信息,请参阅办公室应用程序和项目类型提供的功能。
Microsoft Office 定义了一组扩展性接口,COM VSTO 外接程序可通过实现这些接口来自定义某些功能,例如功能区。 这些接口完全控制可通过其访问的功能。 不过,实现这些接口需要掌握一些有关托管代码中的 COM 互操作性的知识。 在某些情况下,对于熟悉 .NET Framework 的开发人员而言,这些接口的编程模型也并不直观。
使用 Visual Studio 中的 Office 项目模板创建 VSTO 外接程序时,不必实现扩展性接口来自定义功能区之类的功能。 用于办公室运行时的 Visual Studio 工具为你实现这些接口。 相反,你可以使用 Visual Studio 提供的更为直观的类和设计器。 不过,只要你愿意,你仍然可以直接在 VSTO 外接程序中实现扩展性接口。
有关 Visual Studio 为这些功能提供的类和设计器的详细信息,请参阅 自定义任务窗格、 功能区设计器和 创建 Outlook 窗体区域。
可以在 VSTO 外接程序中实现的扩展性接口
下表列出了你可以实现的扩展性接口以及支持这些接口的应用程序。
接口 | 说明 | 应用程序 |
---|---|---|
IRibbonExtensibility | 实现此接口可自定义功能区 UI。 注意:可以将功能区(XML)项添加到项目,以在 VSTO 外接程序中生成默认IRibbonExtensibility实现。 有关更多信息,请参见 Ribbon XML。 | Excel InfoPath 2013 InfoPath 2010 Outlook PowerPoint Project Visio Word |
ICustomTaskPaneConsumer | 实现此接口可创建自定义任务窗格。 | Excel Outlook PowerPoint Word |
FormRegionStartup | 实现此接口可创建 Outlook 窗体区域。 | Outlook |
Microsoft Office 还定义了其他一些扩展性接口,例如 IBlogExtensibility、 EncryptionProvider和 SignatureProvider。 Visual Studio 不支持在使用 Office 项目模板创建的 VSTO 外接程序中实现这些接口。
使用扩展性接口
要使用扩展性接口自定义 UI 功能,请在 VSTO 外接程序项目中实现相应的接口。 然后,重写 RequestService 方法以返回实现该接口的类的实例。
有关演示如何在适用于 Outlook 的 VSTO 外接程序中实现 IRibbonExtensibilityUI 管理器示例的示例应用程序,请参阅办公室开发示例中的 UI 管理器示例。FormRegionStartup ICustomTaskPaneConsumer
实现扩展性接口的示例
下面的代码示例演示用于创建自定义任务窗格的 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 办公室 文档中 2007 办公室 系统中的“创建自定义任务”窗格。
重写 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);
}