Eigener CommandBarButton in der Standard-CommandBar in einem AppointmentItem

TheSmile

Mitglied
Hallo Leute,

ich bastel gerade ein Outlook Add-In mit VS2008 und bin auf ein Problem gestoßen, für das ich im Netz noch keine Lösung finden konnte.

Ich möchte einen eigenen CommandBarButton auf eine schon vorhandene Menüleiste (CommandBar) in Outlook setzten und das ganze nur bei Terminen (AppointmentItem).

Sollte das nicht gehen, wäre auch eine eigene CommandBar nur bei Terminen ok, aber selbst das klappt nicht.

Hier ist mal ein Codefetzen der keine Exception wirft (Add-In wird komplett ohne Fehler geladen), aber den Button einfach nicht anzeigen will:
Code:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
            _CalendarFolder = this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);

            this.appointmentDefaultBar = _CalendarFolder.GetExplorer(false).CommandBars["Standard"];

            // Add an item to the default bar.            
            this.timeToTravelButton = (CommandBarButton)appointmentDefaultBar.Controls.Add(
                                  MsoControlType.msoControlButton, missing,
                                  missing, 1, false);
            // Layout the menu item.
            this.timeToTravelButton.Style = MsoButtonStyle.msoButtonCaption;
            this.timeToTravelButton.Caption = "Time To Travel";
            //this.timeToTravelButton.FaceId = 1098; // some calendar icon
            this.timeToTravelButton.Click += new _CommandBarButtonEvents_ClickEventHandler(this.timeToTravel_Click);

            this.timeToTravelButton.Visible = true;
}

Ich weiß leider nicht, was schief geht. Möglicherweise ist der Ansatz über
Code:
this.Application.Session.GetDefaultFolder
schlicht falsch, aber meine Erfahrung mit Outlook Add-Ins liegt zeitlich leider bis VB6 zurück.

Das Setzen einer neuen CommandBar im Outlookfenster selbst klappt bspw. mit diesem Code:
Code:
            CommandBar myCommandBar = this.Application.ActiveExplorer().CommandBars.Add("custom", MsoBarPosition.msoBarTop, false, true);
            CommandBarControl myCommandBarControl = myCommandBar.Controls.Add(MsoControlType.msoControlPopup, 1, "", 1, true);
            myCommandBarControl.Visible = true;
            myCommandBar.Visible = true;
            myCommandBarControl.Caption = "DEMO";

Danke für eure Hilfe,
Nobbi
 
Ich habe das Problem gelöst und dabei wieder einmal etwas mehr vom Outlook-Konzept gelernt :)

Also, zunächst mal war der Ansatz falsch, denn die folgenden beiden Zeilen liefern nicht die CommandBar des Items, sondern die des Kalender-Views, also wenn man links auf Kalender klickt:
Code:
_CalendarFolder = this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
this.appointmentDefaultBar = _CalendarFolder.GetExplorer(false).CommandBars["Standard"];

Um mein Problem zu lösen, benötigt man die Inspectors von Outlook. Diese liefern z.B. Informationen über das aktuell geöfnete Fenster. Was also getan werden muss ist, einen eigenen InspectorEvent zu registrieren, welcher dann überprüft, ob ein AppointmentItem geöffnet wurde. Wenn ja weiß ich, dass die aktuelle CommandBar des Inspectors die des Termins ist.
Hier mein Code (ich habe jetzt eine eigene CommandBar hinzugefügt mit Button, anstatt den Button zur Standard-CommandBar hinzuzufügen):

(Klassenvariablen sind nicht mit angegeben)
Code:
 private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
   // get all Inspectors of outlook
   inspectors = this.Application.Inspectors;
   // add a new Inspector EventHandler
   inspectors.NewInspector += new Outlook.InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);

   foreach (Outlook.Inspector inspector in inspectors)
   {
      // register EventHandler for each inspector
      Inspectors_NewInspector(inspector);
   }
}

void Inspectors_NewInspector(Outlook.Inspector Inspector)
        {
            // if current item is AppointmentItem, ...
            if (Inspector.CurrentItem is Outlook.AppointmentItem)
            {
                //...  we add the new bar to it
                this.addBar(Inspector);

                // save the reference for a clean shutdown later
                appointmentInspector = Inspector;                               
            }
        }

private void addBar(Outlook.Inspector Inspector)
        {
            myCommandBar = Inspector.CommandBars.Add("My-Tools", MsoBarPosition.msoBarTop, false, true);
            
            myTTTButton = (CommandBarButton)myCommandBar.Controls.Add(MsoControlType.msoControlButton, missing, missing, 1, false);
            // Layout the menu item.
            myTTTButton.Style = MsoButtonStyle.msoButtonIconAndCaption;
            myTTTButton.Caption = "Time To Travel";
            myTTTButton.FaceId = 1098; // some calendar icon
            myTTTButton.Click += new _CommandBarButtonEvents_ClickEventHandler(this.timeToTravel_Click);

            myCommandBar.Visible = true;
            myTTTButton.Visible = true;
        }

Geholfen haben mir unter anderen dieser Beitrag hier (obwohl er in VB geschrieben ist):
http://www.office-loesung.de/ftopic84136_0_0_asc.php

und die MSDN, um das ganze auf C# zu bekommen:
http://msdn.microsoft.com/en-us/library/bb296010.aspx

Ich hoffe es hilft nicht nur mir.

Nobbi
 

Neue Beiträge

Zurück