2012-07-02 14 views
5

Soy nuevo en la programación de Outlook por lo que para el primer paso (más avanzado más adelante) es la siguiente tarea: ¿Cómo acceder a la ventana Inspector Cinta en Outlook?

  • Crear una cinta nueva pestaña

    (Ribbon1) (debe ser mostrado en los exploradores y los nuevos inspectores)
  • al seleccionar (Explorar) o abertura (Inspector) un correo de la ficha de cinta debe mostrar el asunto del correo (Como se ha mencionado para probar)

la parte Explorer fue muy fácil para ponerse en marcha, pero tengo problemas haciendo lo anterior para el nuevo inspecto rs

He intentado diversos enfoques, pero ninguno parece funcionar:

  • He intentado en el NewInspector hacer referencia a los Globals.Ribbons [inspector] .Ribbon1 pero que es siempre nula

  • He intentado en NewInspector suscribirme al evento Activate y hacerlo desde allí, pero allí el Application.ActiveInspector() es nulo y si almaceno una copia global del inspector del evento NewInspector, no funciona. el primer inspector nuevo (solo después del segundo y de los correos electrónicos leídos). no en el correo de redacción)

  • He tratado de utilizar el evento de carga de la cinta, sino que sólo ocurre la primera vez

  • He tratado de utilizar el miembro Globals.Ribbons.Ribbon1 pero que sólo funcionan para el primera vez

(he encontrado un montón de muestras de NewInspector pero nadie parece querer modificar la cinta que no sea éste https://stackoverflow.com/questions/7852017/outlook-2007-ribbon-object-reference-not-set-to-an-instance-of-an-object y por eso no hay respuestas)

esto me está volviendo loco ... es realmente no hay manera de hacer una tarea tan simple !?

Código de ejemplo para referencia

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

Compartir su fuente de cómo se cablea 'InspectorsNewInspector'. Toda la clase AddIn será beneficiosa para el contexto. – SliverNinja

Respuesta

0

Durante el evento 'NewInspector', su cinta a medida que no se ha cargado. Si depura el código, verá que es solo después del evento 'NewInspector' que va al diseñador de cintas personalizado. Lo que puede hacer es implementar lo que necesita durante el evento de carga de cinta personalizado. Es

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

Aquí puede obtener el inspector activo actual. Y de eso puedes obtener el artículo que requieres.

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

me he encontrado con el mismo problema hoy y ocurrió una solución. Básicamente he intentado acceder al Ribbon de un MailItem que acabo de crear.

Para solucionarlo, he realizado un bucle sobre cada una de las cintas en Globals.Ribbons (sin utilizar el indexador de inspector, ya que eso le da una referencia nula). Con cada objeto Ribbon, verifico su contexto que es del tipo Inspector.Luego puedo hacer una comprobación de igualdad en el Inspector.CurrentItem para determinar si sus referencias son iguales. Si son iguales que conozco para utilizar ese Ribbon

He aquí un fragmento

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