2

Est-il possible d'accéder à ActiveInspector au moment du chargement du ruban. Application.ActiveInspector() renvoie la valeur correcte lorsque j'utilise un formulaire personnalisé mais pas pour le formulaire de contact par défaut.Application.ActiveInspector() est nul sur la charge du ruban Outlook

J'ai besoin de l'ActiveInspector pour personnaliser le bouton ruban en fonction de la valeur d'une propriété dans ActiveInspector(). CurrentItem.

Répondre

0

Pouvez-vous gérer l'événement NewInspector de la collection Inspectors, puis conserver cela dans un champ statique (probablement utiliser un WeakReference) auquel vous pouvez accéder à partir de l'événement de chargement de ruban?

Je n'ai pas fait de personnalisation du ruban avec Outlook, mais j'ai fait un travail considérable avec les inspecteurs de mon ancien produit Tablet PC, TEO. Il est difficile de travailler avec, mais la principale chose que vous ne voulez pas faire est de rester sur une référence d'inspecteur trop longtemps parce que vous aurez toutes sortes de problèmes étranges avec l'arrêt d'Outlook ou l'annulation des modifications en attente.

1

Je fais une légère variation sur ce qui précède en ce que je maintiens la liste des inspecteurs ouverts (j'enveloppe l'inspecteur et le garde dans la liste). Les ajouter sur le nouvel événement d'inspecteur et les supprimer lors d'un événement de fermeture rapprochée.

Dans mon code de ruban, j'ai une méthode statique FindOutlookInspector qui trouve l'inspecteur en utilisant le control.context du ruban.

Quelque chose le long de ces lignes ..

OutlookInspector est ma classe d'inspecteur enveloppé, mais vous ne pouvez pas besoin que etc. Aussi je cherche uniquement à la poste Articles

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

Ensuite, dans le code de ruban je peux appeler FindOutlookInspector pour obtenir l'inspecteur enveloppé

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

@ 76mel Assurez-vous de diminution explicitement les références COM de point o objets. YMMV. –

Questions connexes