2

Ist es möglich, auf den ActiveInspector zum Zeitpunkt der Bandladung zuzugreifen. Application.ActiveInspector() gibt richtigen Wert zurück, wenn ich benutzerdefiniertes Formular aber nicht für Standardkontaktformular verwende.Application.ActiveInspector() ist Null auf Outlook Ribbon Load

Ich brauche den ActiveInspector zum Anpassen der Menüband-Schaltfläche abhängig von einem Eigenschaftswert in ActiveInspector(). CurrentItem.

Antwort

0

Können Sie das NewInspector-Ereignis der Inspectors-Auflistung verarbeiten und dann in einem statischen Feld (wahrscheinlich sollte eine WeakReference verwendet werden), auf die Sie vom Bandladeereignis zugreifen können?

Ich habe keine Ribbon-Anpassung mit Outlook gemacht, aber ich habe umfangreiche Arbeit mit Inspektoren in meinem alten Tablet PC-Produkt, TEO. Es ist ein Ärger mit dir zu arbeiten, aber die Hauptsache, die du nicht machen willst, ist, dich zu lange an einen Inspector-Verweis zu hängen, weil du alle möglichen seltsamen Probleme mit dem Herunterfahren von Outlook oder dem Abbrechen von ausstehenden Änderungen bekommst.

1

Ich mache eine leichte Variation über die oben in, dass ich Liste der offenen Inspektoren pflegen (ich wickle den Inspektor und behalte das in der Liste). Hinzufügen sie auf dem neuen Inspector-Ereignis und entfernen sie auf einem verdrahteten Close-Event zu schließen.

In meinem Menübandcode habe ich eine statische Methode FindOutlookInspector, die den Inspektor mit dem control.context des Menübands findet.

Etwas in dieser Richtung ..

OutlookInspector ist Klasse meine gewickelt Inspektor, aber Sie können nicht, dass usw. benötigen auch mich interessiert nur Postsendungen

void _inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector) { 
    OutlookItem olItem = null; 
    try { 
     object newitem = Inspector.CurrentItem; 
     olItem = new OutlookItem(newitem); 
     if (olItem.Class == Outlook.OlObjectClass.olMail && olItem.MessageClass == "IPM.Note") { 

      OutlookInspector existingWindow = FindOutlookInspector(Inspector); 

      if (existingWindow == null) { 
       OutlookInspector window = new OutlookInspector(Inspector); 

       window.Close += new EventHandler(WrappedWindow_Close); 
       _windows.Add(window); 
      } 

     } catch (Exception ex) { 
      throw ex; 
     } 
    } 

    void WrappedWindow_Close(object sender, EventArgs e) { 
     OutlookInspector window = (OutlookInspector) sender; 
     window.Close -= WrappedWindow_Close; 
     _windows.Remove(window); 
    } 

    internal static OutlookInspector FindOutlookInspector(object window) { 
     foreach(OutlookInspector inspector in _windows) { 
      if (inspector.Window == window) { 
       return inspector; 
      } 
     } 
     return null; 
    } 

Dann im Code Band kann ich rufen FindOutlookInspector der umwickelte Inspektor

OutlookInspector window = ThisAddIn.FindOutlookInspector(control.Context); 
+0

@ 76mel Achten Sie darauf, zu erhalten, verringert explizit eine der COM-Referenzen von Punkt o Objekte. YMMV. –