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

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

**适用于:**本主题中的信息适用于 Microsoft Office 2010 和 2007 Microsoft Office system 的应用程序级项目。有关更多信息,请参见按 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 2007 和 Excel 2010

InfoPath 2010

Outlook 2007 和 Outlook 2010

PowerPoint 2007 和 PowerPoint 2010

Project 2010

Visio 2010

Word 2007 和 Word 2010

Microsoft.Office.Core.ICustomTaskPaneConsumer

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

Excel 2007 和 Excel 2010

Outlook 2007 和 Outlook 2010

PowerPoint 2007 和 PowerPoint 2010

Word 2007 和 Word 2010

Microsoft.Office.Interop.Outlook.FormRegionStartup

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

Outlook 2007 和 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 管理器示例。

实现扩展性接口的示例

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

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

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

    提示

    若要向 COM 公开 TaskPaneUI 类,您必须同时为项目设置“为 COM 互操作注册”属性。 有关更多信息,请参见 如何:为 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", Type.Missing);
            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 中创建自定义任务窗格

重写 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 解决方案