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