2012-10-01 4 views
5

Weder das NewDocument-Ereignis noch das DocumentOpen-Ereignis werden beim ersten Laden von Microsoft Word ausgelöst. Wenn eine Instanz von Word bereits geöffnet ist und wenn ein neues oder ein vorhandenes Dokument geöffnet wird, werden diese Ereignisse problemlos ausgelöst.Behandeln des Word DocumentChange-Ereignisses, da das NewDocument-Ereignis beim Laden nicht ausgelöst wird

Der Vorschlag, den ich gesehen habe, ist die Behandlung des DocumentChange-Ereignisses (das immer ausgelöst wird, wenn Word geladen wird) anstelle der beiden anderen Ereignisse.

Meine Frage ist, wie würde ich darüber gehen? Das DocumentChange-Ereignis hat keine Parameter. Woher weiß ich also, wann das Dokument (neu oder vorhanden) gerade geöffnet wurde?

Außerdem habe ich bereits Logik im DocumentChange-Ereignis und die Verarbeitung für neue und vorhandene Dokumente ist anders, so dass ich nicht einfach meinen gesamten Code in das Ereignis werfen kann.

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

Antwort

2

Also habe ich das geladene Dokument in ThisAddIn_Startup verarbeitet. Wenn der Pfad des Dokuments eine leere Zeichenfolge ist, wissen wir, dass das Dokument neu ist und noch nie auf dem lokalen Computer gespeichert wurde. Sonst weiß ich, dass es gespeichert ist (einschließlich im temporären Verzeichnis) und ich es als ein bestehendes Dokument verarbeite.

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

Wie mein Kommentar für Antwort Staaten der Deni: die Event-Handler Document Einstellung in ThisAddIn.Desiger.cs Initialize() -Methode für bestehende Dokumente gearbeitet, aber NewDocument nicht für ein neues Dokument initialisiert aufgerufen, wenn Word öffnet, Also diese Lösung hat nicht funktioniert. Also habe ich die Einstellung von DocumentOpen und NewDocument im ThisAddIn_Startup-Ereignis belassen, andernfalls wird DocumentOpen ausgelöst, wenn ein Dokument mit Word geladen wird.

2

This Link wird Ihnen helfen, im Grunde, was sie sagen, ist, dass ThisAddIn_Startup läuft nach das Ereignis Document Ausführung beendet ist. Es gibt auch eine Problemumgehung für das Problem, folgen Sie einfach dem Hyperlink.

+0

Dies funktioniert perfekt für _DocumentOpen, funktioniert aber nicht für _NewDocument. Ich erinnere mich irgendwo zu lesen, dass _NewDocument nur ausgelöst wird, wenn ein Benutzer Datei-> Neu und nicht, wenn Word mit einem neuen Dokument öffnet. Wenn das stimmt, irgendwelche Ideen, wie man mit einem neuen Dokument umgeht, wenn sich das Wort öffnet? _WindowActivate wird jedes Mal ausgelöst, wenn Word den Fokus erhält, nicht nur beim ersten Öffnen von Word. Also könnte ich versuchen, _WindowActivate zu handhaben, aber ich fühle, dass das chaotisch werden könnte. Gedanken? –

1

Ich habe die Application.Documents-Auflistung im Startup-Handler verwendet, um alle vorhandenen Dokumente zu finden, bevor mein Add-In geladen wird. Es erfüllt dasselbe wie Ihre Antwort. Wenn Sie das Add-In später aus beliebigem Grund (statt aus Word) laden, kann das Aufzählen der Sammlung mehr als nur das aktive Dokument enthalten.

Das Ereignis DocumentChange() wird ausgelöst, wenn ActiveDocument geändert wird. Word hat nur ein aktives Dokument zu einem Zeitpunkt. Wenn Sie zwischen mehreren geöffneten Word-Dokumenten wechseln, wird das Ereignis ausgelöst. Beim Schließen von Dokumenten kann das Ereignis ausgelöst werden, wenn ein anderes geöffnetes Dokument aktiv wird. Es wird auch ausgelöst, nachdem das letzte Dokument geschlossen wurde. In diesem Fall ist Application.ActiveDocument ungültig.

Verwandte Themen