2012-10-01 6 views
5

Né l'evento NewDocument né l'evento DocumentOpen vengono generati quando viene caricato prima Microsoft Word. Quando un'istanza di Word è già aperta e viene aperto un documento nuovo o esistente, questi eventi si attivano correttamente.Come gestire l'evento Word DocumentChange poiché l'evento NewDocument non viene generato sul carico

Il suggerimento che ho visto è di gestire l'evento DocumentChange (che viene sempre attivato quando Word carica) invece degli altri due eventi.

La mia domanda è: come andrei a fare questo? L'evento DocumentChange non ha parametri, quindi come faccio a sapere quando il documento (nuovo o esistente) è stato appena aperto?

Inoltre, ho già una logica nell'evento DocumentChange e l'elaborazione per i documenti nuovi ed esistenti è diversa, quindi non posso semplicemente inserire tutto il mio codice nell'evento.

private void ThisAddIn_Startup(object sender, System.EventArgs a) 
{ 
    this.Application.DocumentChange += new ApplicationEvents4_DocumentChangeEventHandler(Application_DocumentChange); 
} 

private void Application_DocumentChange() 
{ 
    // How do I handle NewDocument or DocumentOpen? 
} 

risposta

2

Così ho finito per elaborare il documento caricato in ThisAddIn_Startup. Se il percorso del documento è una stringa vuota, allora sappiamo che il documento è nuovo e non è mai stato salvato sul computer locale. Altrimenti, so che viene salvato (incluso nella directory temporanea) e lo elabro come un documento esistente.

private void ThisAddIn_Startup(object sender, System.EventArgs a) 
{ 
    try 
    { 
    Word.Document doc = this.Application.ActiveDocument; 
    if (String.IsNullOrWhiteSpace(doc.Path)) 
    { 
     ProcessNewDocument(doc); 
    } 
    else 
    { 
     ProcessDocumentOpen(doc); 
    } 
    } 
    catch (COMException e) 
    { 
    log.Debug("No document loaded with word."); 
    } 

    // These can be set anywhere in the method, because they are not fired for documents loaded when Word is initialized. 
    ((MSWord.ApplicationEvents4_Event)this.Application).NewDocument += 
    new MSWord.ApplicationEvents4_NewDocumentEventHandler(Application_NewDocument); 
    this.Application.DocumentOpen += 
    new MSWord.ApplicationEvents4_DocumentOpenEventHandler(Application_DocumentOpen); 
} 

Come il mio commento per risposta gli stati di Deni: Impostazione del gestore di eventi DocumentOpen in inizializzazione di ThisAddIn.Desiger.cs() metodo ha funzionato per i documenti esistenti, ma NewDocument non viene chiamato per un nuovo documento inizializzato quando si apre Word, quindi questa soluzione non ha funzionato. Così ho lasciato l'impostazione di DocumentOpen e NewDocument nell'evento ThisAddIn_Startup, altrimenti verrà attivato DocumentOpen quando un documento viene caricato anche con Word.

2

This collegamento vi aiuterà, in fondo quello che dicono è che ThisAddIn_Startup corre dopo l'evento DocumentOpen ha terminato l'esecuzione. C'è anche una soluzione alternativa per il problema basta seguire il collegamento ipertestuale.

+0

Ciò funziona perfettamente per _DocumentOpen ma non funziona per _NewDocument. Ricordo di aver letto da qualche parte che _NewDocument viene attivato solo quando un utente fa File-> Nuovo e non quando Word si apre con un nuovo documento. Se questo è vero, qualsiasi idea su come gestire un nuovo documento quando si apre la parola? _WindowActivate si attiva ogni volta che Word acquisisce lo stato attivo, non solo la prima volta che si apre Word. Quindi potrei provare a gestire _WindowActivate, ma credo che potrebbe essere complicato. Pensieri? –

1

Ho utilizzato la raccolta Application.Documents nel gestore di avvio per trovare tutto il documento esistente prima del caricamento del mio componente aggiuntivo. Esegue la stessa funzione della tua risposta, inoltre, se carichi il componente aggiuntivo in seguito su richiesta (piuttosto che all'avvio di Word) per qualsiasi ragione, l'enumerazione della raccolta può ottenere più del semplice documento attivo.

L'evento DocumentChange() si attiva ogni volta che si modifica ActiveDocument. Word ha solo un documento attivo alla volta. Passando da più documenti di Word aperti si attiva l'evento. Inoltre, durante la chiusura dei documenti, l'evento potrebbe essere attivato mentre un altro documento aperto diventa attivo. Si attiva anche dopo la chiusura dell'ultimo documento, nel qual caso Application.ActiveDocument non sarà valido.

Problemi correlati