使用擴充性介面自訂 UI 功能

當您使用 Visual Studio 中的 Office 開發工具,在 VSTO 增益集中建立自訂工作窗格、功能區自訂和 Outlook 表單區域時,這些工具提供可處理許多實作詳細資料的類別和設計工具。 不過,如果您有特殊需求,也可以針對每項功能自行實作 「擴充性介面」 (Extensibility Interface)。

適用于: 本主題中的資訊適用于專案中的 VSTO [加入] - 。 如需詳細資訊,請參閱 依 Office 應用程式和專案類型提供的功能

擴充性介面的總覽

Microsoft Office 定義一組 COM VSTO 增益集可實作以自訂特定功能 (例如功能區) 的擴充性介面。 這些介面提供可存取功能的完整控制權。 然而,您需要對 Managed 程式碼中的 COM 互通性有些了解,才能實作這些介面。 在某些情況下,這些介面的程式撰寫模型對熟悉 .NET Framework 的開發人員而言,也不是那麼直接易懂。

當您使用 Visual Studio 中的 Office 專案範本建立 VSTO 增益集時,您不需要實作擴充性介面來自訂功能區等功能。 Visual Studio Tools for Office Runtime 會為您實作這些介面。 相反地,您可以使用 Visual Studio 所提供之更直覺的類別和設計工具。 不過,如果需要,您仍可直接在 VSTO 增益集中實作擴充性介面。

如需 Visual Studio 針對這些功能所提供之類別和設計工具的詳細資訊,請參閱自訂工作窗格功能區設計工具,以及建立 Outlook 的表單區域

您可以在 VSTO 增益集中執行的擴充性介面

下表列出您可以實作的擴充性介面,以及支援這些介面的應用程式。

介面 描述 應用程式
IRibbonExtensibility 實作這個介面可自訂功能區 UI。 注意: 您可以將 功能區 (XML) 專案加入至專案,以 IRibbonExtensibility 在 VSTO 增益集產生預設的實值。 如需詳細資訊,請參閱 Ribbon XML Excel

InfoPath 2013

InfoPath 2010

Outlook

PowerPoint

Project

Visio

Word
ICustomTaskPaneConsumer 實作這個介面可建立自訂工作窗格。 Excel

Outlook

PowerPoint

Word
FormRegionStartup 實作這個介面可建立 Outlook 表單區域。 Outlook

Microsoft Office 還定義其他幾個擴充性介面,例如 IBlogExtensibilityEncryptionProviderSignatureProvider。 Visual Studio 不支援在使用 Office 專案範本建立的 VSTO 增益集中實作這些介面。

使用擴充性介面

若要使用擴充性介面自訂 UI 功能,請在您的 VSTO 增益集專案中實作適當的介面。 然後,覆寫 RequestService 方法以傳回實作介面的類別執行個體。

如需示範如何 IRibbonExtensibility ICustomTaskPaneConsumer FormRegionStartup 在適用于 Outlook 的 VSTO 增益集中執行、和介面的範例應用程式,請參閱Office 開發範例中的 UI 管理員範例。

執行擴充性介面的範例

下列程式碼範例示範 ICustomTaskPaneConsumer 介面的簡單實作,以建立自訂工作窗格。 這個範例會定義兩個類別:

  • TaskPaneHelper 類別實作 ICustomTaskPaneConsumer ,以建立及顯示自訂工作窗格。

  • TaskPaneUI 類別提供工作窗格的 UI。 TaskPaneUI 類別的屬性讓 COM 可以看見該類別,進而讓 Microsoft Office 應用程式可以探索該類別。 在這個範例中,UI 是空的 UserControl,但是您可以透過修改程式碼來加入控制項。

    注意

    若要將 TaskPaneUI 類別公開至 COM,您也必須設定專案的 [註冊 COM Interop] 屬性。

    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
    {
    }
    

    如需有關如何執行的詳細資訊 ICustomTaskPaneConsumer ,請參閱 Microsoft Office 檔中的在2007 Office 系統中建立自訂工作窗格

覆寫 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);
}

另請參閱