Gewusst wie: Hinzufügen von Befehlen zu Kontextmenüs in Word

In diesem Beispiel wird veranschaulicht, wie einem Kontextmenü in Word mit einem Add-In auf Anwendungsebene ein Befehl hinzugefügt wird. Das Kontextmenü wird angezeigt, wenn Sie mit der rechten Maustaste auf ein Dokument klicken.

Betrifft: Die Informationen in diesem Thema betreffen Projekte auf Dokument- und auf Anwendungsebene für Word 2007 und Word 2010. Weitere Informationen finden Sie unter Verfügbare Funktionen nach Office-Anwendung und Projekttyp.

Fügen Sie der ThisAddIn-Klasse in einem Projekt auf Anwendungsebene für Word den folgenden Code hinzu. Zum Ausführen dieses Codes muss sich eine Word-Vorlage mit dem Namen MyCustomTemplate.dotx im Ordner "Eigene Dateien" (für Windows XP und früher) oder im Ordner "Dokumente" (für neuere Versionen von Windows) befinden.

Beispiel

Private MyApplication As Word.Application
Private WithEvents myControl As Office.CommandBarButton
Private customTemplate As Word.Template

Private Sub ThisAddIn_Startup _
(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup

    MyApplication = Me.Application

    GetCustomTemplate()
    RemoveExistingMenuItem()
    AddMenuItem()

End Sub

Private Sub GetCustomTemplate()
    Dim TemplatePath As String = Environment.GetFolderPath _
        (Environment.SpecialFolder.MyDocuments) + "\MyCustomTemplate.dotx"
    Dim install As Boolean = True

    For Each installedTemplate As Word.Template In MyApplication.Templates
        If installedTemplate.FullName = DirectCast(TemplatePath, String) Then
            install = False
        End If
    Next

    If install = True Then
        MyApplication.AddIns.Add(TemplatePath.ToString(), True)
    End If
    customTemplate = MyApplication.Templates.Item(TemplatePath)
End Sub

Private Sub RemoveExistingMenuItem()

    Dim contextMenu As Office.CommandBar = _
    MyApplication.CommandBars("Text")

    MyApplication.CustomizationContext = customTemplate

    Dim control As Office.CommandBarButton = contextMenu.FindControl _
        (Office.MsoControlType.msoControlButton, System.Type.Missing, _
         "MyMenuItem", True, True)

    If Not (control Is Nothing) Then
        control.Delete(True)
    End If

End Sub

Private Sub AddMenuItem()

    MyApplication.CustomizationContext = customTemplate

    Dim menuItem As Office.MsoControlType = _
        Office.MsoControlType.msoControlButton

    myControl = CType(MyApplication.CommandBars("Text").Controls.Add _
       (menuItem, 1, True), Office.CommandBarButton)

    myControl.Style = Office.MsoButtonStyle.msoButtonCaption
    myControl.Caption = "My Menu Item"
    myControl.Tag = "MyMenuItem"
    customTemplate.Saved = True

    GC.Collect()

End Sub


Sub myControl_Click(ByVal Ctrl As Microsoft.Office.Core.CommandBarButton, _
                    ByRef CancelDefault As Boolean) Handles myControl.Click

    System.Windows.Forms.MessageBox.Show("My Menu Item clicked")

End Sub
private Word.Application myApplication;
private Office.CommandBarButton myControl;
private Word.Template customTemplate; 

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    myApplication = this.Application;

    GetCustomTemplate();
    RemoveExistingMenuItem();
    AddMenuItem(); 
}

private void GetCustomTemplate()
{
    object TemplatePath = Environment.GetFolderPath
        (Environment.SpecialFolder.MyDocuments) + 
        "\\MyCustomTemplate.dotx";
    object install = true;

    foreach (Word.Template installedTemplate in myApplication.Templates)
    {
        if (installedTemplate.FullName == (string)TemplatePath)
        {
            install = false;
        }
    }
    if ((bool)install)
    {
        myApplication.AddIns.Add(TemplatePath.ToString(), ref install);
    }
    customTemplate = myApplication.Templates.get_Item(ref TemplatePath);

}

private void RemoveExistingMenuItem()
{
    Office.CommandBar contextMenu = myApplication.CommandBars["Text"];
    myApplication.CustomizationContext = customTemplate;

    Office.CommandBarButton control = 
        (Office.CommandBarButton)contextMenu.FindControl
        (Office.MsoControlType.msoControlButton, missing,
        "MyMenuItem", true, true);

    if ((control != null))
    {
        control.Delete(true);
    }

}

private void AddMenuItem()
{
    myApplication.CustomizationContext = customTemplate;
    Office.MsoControlType menuItem = 
        Office.MsoControlType.msoControlButton;

    myControl = 
        (Office.CommandBarButton)myApplication.CommandBars["Text"].Controls.Add
        (menuItem,missing, missing, 1, true);

    myControl.Style = Office.MsoButtonStyle.msoButtonCaption;
    myControl.Caption = "My Menu Item";
    myControl.Tag = "MyMenuItem";

    myControl.Click += 
        new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler
            (myControl_Click);

    customTemplate.Saved = true;

    GC.Collect();

}


void myControl_Click(Microsoft.Office.Core.CommandBarButton Ctrl, 
    ref bool CancelDefault)
{
    System.Windows.Forms.MessageBox.Show("My Menu Item clicked");
}

Robuste Programmierung

Sie müssen beim Hinzufügen von Ereignishandlern die Tag-Eigenschaft der Steuerelemente festlegen. Office verwendet die Tag-Eigenschaft, um Ereignishandler für ein bestimmtes CommandBarControl-Objekt zu verfolgen. Wenn die Tag-Eigenschaft leer ist, werden Ereignisse nicht ordnungsgemäß behandelt.

Deklarieren Sie die Menüvariablen auf Klassenebene und nicht in der Methode, in der sie aufgerufen werden. Damit ist sichergestellt, dass die Menüvariablen so lange im Gültigkeitsbereich bleiben, wie die Anwendung ausgeführt wird. Ansonsten wird das Element von der Garbage Collection entfernt, und die Ausführung des Codes im Ereignishandler wird angehalten.

Legen Sie bei jedem Hinzufügen oder Entfernen eines Befehls die CustomizationContext-Eigenschaft des Application-Objekts auf dasselbe Dokument oder dieselbe Vorlage fest.

Siehe auch

Aufgaben

Gewusst wie: Erstellen von Office-Symbolleisten

Exemplarische Vorgehensweise: Erstellen von Kontextmenüs für Lesezeichen

Gewusste wie: Hinzufügen von Befehlen zu Kontextmenüs in Excel

Gewusst wie: Hinzufügen von benutzerdefinierten Menüs und Menüelementen zu Outlook

Gewusst wie: Hinzufügen benutzerdefinierter Symbole zu Symbolleisten- und Menüelementen

Konzepte

Optionale Parameter in Office-Lösungen

Weitere Ressourcen

Anpassung der Office-Benutzeroberfläche