使用扩展性接口自定义 UI 功能

在 Visual Studio 中的 Office 开发工具提供了一些选件类和设计器,在应用程序级外接程序中使用它们创建自定义任务窗格、功能区自定义项和 Outlook 窗体区域。不过,如果您有特殊要求,也可以自己为每项功能实现扩展性接口。

**适用于:**本主题中的信息适用于 Microsoft Office 2013 和 Microsoft Office 2010 的应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能

扩展性接口概述

Microsoft Office 定义了一组 COM 外接程序可以实现自定义某些功能的扩展性接口,例如功能区。通过这些接口,可完全控制对其提供访问权限的功能。不过,实现这些接口需要掌握一些有关托管代码中的 COM 互操作性的知识。在某些情况下,对于熟悉 .NET Framework 的开发人员而言,这些接口的编程模型也并不直观。

当使用创建外接程序使用 Visual Studio 中的 Office 项目模板时,不必实现扩展性接口来自定义与该功能区的功能。Visual Studio Tools for Office Runtime为您实现这些接口。相反,可以使用 Visual Studio 提供的更直观的类和设计器。不过,如果您愿意,则仍可以直接在外接程序中实现扩展性接口。

有关 Visual Studio 为这些功能提供的类和设计器的更多信息,请参见自定义任务窗格功能区设计器创建 Outlook 窗体区域

可在外接程序中实现的扩展性接口

下表列出了您可以实现的扩展性接口以及支持这些接口的应用程序。

接口

描述

应用程序

Microsoft.Office.Core.IRibbonExtensibility

实现此接口可自定义功能区 UI。

说明说明
可以将“功能区(XML)”项添加到项目,以便在外接程序中生成默认 Microsoft.Office.Core.IRibbonExtensibility 实现。有关更多信息,请参见功能区 XML

Excel 2013

InfoPath 2013

Outlook 2013

PowerPoint 2013

Project 2013

Visio 2013

Word 2013

Excel 2010

InfoPath 2010

Outlook 2010

PowerPoint 2010

Project 2010

Visio 2010

Word 2010

Microsoft.Office.Core.ICustomTaskPaneConsumer

实现此接口可创建自定义任务窗格。

Excel 2013

Outlook 2013

PowerPoint 2013

Word 2013

Excel 2010

Outlook 2010

PowerPoint 2010

Word 2010

Microsoft.Office.Interop.Outlook.FormRegionStartup

实现此接口可创建 Outlook 窗体区域。

Outlook 2013

Outlook 2010

Microsoft Office 还定义了其他一些扩展性接口,例如 Microsoft.Office.Core.IBlogExtensibilityMicrosoft.Office.Core.EncryptionProviderMicrosoft.Office.Core.SignatureProvider。Visual Studio 不支持在使用 Office 项目模板创建的外接程序中实现这些接口。

使用扩展性接口

若要使用扩展性接口自定义 UI 功能,请在外接程序项目中实现相应的接口。然后,重写 RequestService 方法以返回实现该接口的类的实例。

有关演示如何在 Outlook 的外接程序中实现 Microsoft.Office.Core.IRibbonExtensibilityMicrosoft.Office.Core.ICustomTaskPaneConsumerMicrosoft.Office.Interop.Outlook.FormRegionStartup 接口的示例应用程序,请参见 Office 开发示例中的 UI 管理器示例。

Bb608601.collapse_all(zh-cn,VS.110).gif实现扩展性接口的示例

下面的代码示例演示用于创建自定义任务窗格的 Microsoft.Office.Core.ICustomTaskPaneConsumer 接口的简单实现。此示例定义两个类:

  • TaskPaneHelper 类实现 Microsoft.Office.Core.ICustomTaskPaneConsumer 以创建和显示自定义任务窗格。

  • TaskPaneUI 类提供任务窗格的 UI。TaskPaneUI 类的特性使类对于 COM 可见,从而使 Microsoft Office 应用程序能够发现该类。在此示例中,UI 是一个空 UserControl,但您可以通过修改代码来添加控件。

    说明说明

    若要向 COM 公开 TaskPaneUI 类,您必须同时为项目设置“为 COM 互操作注册”属性。有关更多信息,请参见管理编译属性

Public Class TaskPaneHelper
    Implements Office.ICustomTaskPaneConsumer

    Friend taskPane As Office.CustomTaskPane

    Public Sub CTPFactoryAvailable(ByVal CTPFactoryInst As Office.ICTPFactory) _
        Implements Office.ICustomTaskPaneConsumer.CTPFactoryAvailable

        If CTPFactoryInst IsNot Nothing Then
            ' Create a new task pane.
            taskPane = CTPFactoryInst.CreateCTP( _
                "Microsoft.Samples.Vsto.VB.TaskPaneUI", "Contoso")
            taskPane.Visible = True
        End If
    End Sub
End Class

<System.Runtime.InteropServices.ComVisible(True)> _
<System.Runtime.InteropServices.ProgId("Microsoft.Samples.Vsto.VB.TaskPaneUI")> _
<System.Runtime.InteropServices.Guid("FFA0920E-F7A5-453d-8AB2-249F4C25B4B2")> _
Public Class TaskPaneUI
    Inherits UserControl
End Class
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
{
}

有关实现 Microsoft.Office.Core.ICustomTaskPaneConsumer 的更多信息,请参见 Microsoft Office 文档中的在 2007 Office System 中创建自定义任务窗格

Bb608601.collapse_all(zh-cn,VS.110).gif重写 RequestService 方法的示例

下面的代码示例演示如何重写 RequestService 方法以从前面的代码示例中返回 TaskPaneHelper 类的实例。它将检查 serviceGuid 参数的值以确定请求的是哪个接口,然后返回实现该接口的对象。

Friend taskPaneHelper1 As TaskPaneHelper

Protected Overrides Function RequestService( _
    ByVal serviceGuid As Guid) As Object

    If (serviceGuid = GetType(Office.ICustomTaskPaneConsumer).GUID) Then
        If (taskPaneHelper1 Is Nothing) Then
            taskPaneHelper1 = New TaskPaneHelper()
        End If
        Return taskPaneHelper1
    End If

    Return MyBase.RequestService(serviceGuid)
End Function
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);
}

请参见

任务

如何:在 Visual Studio 中创建 Office 项目

概念

从其他 Office 解决方案调用应用程序级外接程序中的代码

应用程序级外接程序的体系结构

其他资源

Office 开发示例和演练

应用程序级外接程序编程

开发 Office 解决方案