2012-07-02 19 views
5

Jestem nowy w programowaniu Outlook tak dla pierwszego etapu (bardziej zaawansowany później) jest następujące zadanie:Jak uzyskać dostęp do okna Inspektora Wstążka w programie Outlook?

  • Utwórz nowy wstążka zakładka (Ribbon1) (należy zamieścić w odkrywców i nowych inspektorów)
  • Przy wyborze (Przeglądaj) lub otwarcie (Inspektor) pocztę karta wstążki powinna pokazać przedmiot pocztą (Jak wspomniano przetestować)

Explorer część była dość łatwo dostać się dzieje, ale mam problemy z powyższym dla nowego inspecto rs

Próbowałem różnych podejść, ale żaden nie wydają się działać:

  • Próbowałem w NewInspector odwołać się do Globals.Ribbons [inspektor] .Ribbon1 ale to jest zawsze zerowa

  • Próbowałem w NewInspector, aby zasubskrybować zdarzenie Activate i zrobić to stamtąd, ale tam Application.ActiveInspector() ma wartość null i jeśli przechowuję globalną kopię inspektora ze zdarzenia NewInspector, to nie działa on pierwszy nowy inspektor (tylko po drugim i przeczytanym mailu. nie na tworzenie wiadomości)

  • Próbowałem użyć zdarzenia Ribbon Załaduj ale to zdarza się tylko za pierwszym razem

  • Próbowałem użyć elementu Globals.Ribbons.Ribbon1 ale tylko pracować dla pierwszy raz

(Znalazłem wiele próbek NewInspector ale nikt nie wydają się chce zmodyfikować wstążkę inny niż ten https://stackoverflow.com/questions/7852017/outlook-2007-ribbon-object-reference-not-set-to-an-instance-of-an-object a do tego nie ma żadnych odpowiedzi)

jest to mi jazdy szalony ... Jest tak naprawdę nie ma sposobu na wykonanie tak prostego zadania !?

Przykładowy kod dla odniesienia

void InspectorsNewInspector(Outlook.Inspector inspector) 
    { 
     AddInspectorEventHandlers(inspector); 
    } 

    private void AddInspectorEventHandlers(Outlook.Inspector inspector) 
    { 
     if (inspector == null) 
     { 
      return; 
     } 

     Ribbon1 ribbon1 = Globals.Ribbons[inspector].Ribbon1; //This always return null!!! 

     ((Outlook.InspectorEvents_10_Event)inspector).Activate += InspectorActivate; 
     ((Outlook.InspectorEvents_10_Event)inspector).Close += InspectorClose; 

     _openInspectors.Add(inspector); 
    } 
+0

Podziel Twoim źródłem jak drut 'InspectorsNewInspector'. Cała klasa AddIn będzie korzystna dla kontekstu. – SliverNinja

Odpowiedz

0

W przypadku, gdy 'NewInspector' Niestandardowy wstążka nie jest załadowana. Jeśli debugujesz kod, zobaczysz, że dopiero po zdarzeniu "NewInspector" trafia on do projektanta niestandardowych wstążek. To, co możesz zrobić, to zaimplementować to, czego potrzebujesz podczas niestandardowego zdarzenia ładowania wstążki. To jest

private void MyRibbon_Load(object sender, RibbonUIEventArgs e){} 

Tutaj można uzyskać aktualny aktywny inspektor. I z tego możesz uzyskać wymagany przedmiot.

Ex:

 Inspector inspector = Globals.WPTAddIn.Application.ActiveInspector(); 
     if (inspector != null) 
     { 
      if (inspector.CurrentItem != null) 
      { 
       if (inspector.CurrentItem is MeetingItem) 
       { 
        MeetingItem meetingItem = (MeetingItem)inspector.CurrentItem;}}} 
0

Zabrakło mi na ten sam problem dzisiaj i wyszedł z obejścia. Zasadniczo próbuję uzyskać dostęp do utworzonego właśnie Ribbon z .

Aby to obejść, zapętlałem każdy z taśm w Globals.Ribbons (bez użycia indeksera inspektora, ponieważ daje to zerową referencję). Z każdym obiektem Ribbon sprawdzam jego kontekst, który jest typu Inspector.Mogę następnie wykonać test równości na Inspector.CurrentItem, aby ustalić, czy ich odniesienia są równe. Jeśli są równe wiem w obsłudze, że Ribbon

Oto urywek

Outlook.MailItem mail = (Outlook.MailItem)this.Application.CreateItem(Outlook.OlItemType.olMailItem); 
Outlook.Inspector currentInspector = (Outlook.Inspector)mail.GetInspector; 

Ribbon2 currentRibbon = null; 
foreach (Ribbon2 ribbon in Globals.Ribbons) 
{ 
    var ribbonInspector = (Outlook.Inspector)ribbon.Context; 
    if (ribbonInspector.CurrentItem.Equals(currentInspector.CurrentItem)) 
    { 
     currentRibbon = (Ribbon2)ribbon; 
     break; 
    } 
} 
Powiązane problemy