[c#] VSTO / Word 2007 plugin ribbon aansturen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 16:25
Beste allemaal,

Ik ben momenteel bezig met een plugin voor Word 2007. Onderdelen hiervan zijn een ribbon, verschillende dialoogvensters en natuurlijk de nodige code.

Nu is het zo dat mijn ribbon gedeeltelijk betrekking heeft op het actuele document in Word. Sommige knoppen moeten dus bijvoorbeeld disabled zijn wanneer er geen actief document is. Als er wel een document is geladen, wil ik met xml schema's gaan uitlezen welke knoppen actief moeten worden.

Om bovenstaande te bereiken wil ik events van Word afvangen en aan de hand daarvan bepalen wat er met de toolbar moet gebeuren. Ik kan alleen niet de juiste events vinden en er is nog iets vreemds.

Ik had gehoopt op het applicatie-object events af te vangen wanneer documenten worden gewisseld, worden geopend en wanneer deze worden gesloten. Probleem is echter dat alleen voor de eerste twee events bestaan, te weten DocumentOpen en DocumentChange. Voor het sluiten van documenten is er geen event. Nou heb ik al wat gestoeid en kan ik veel afvangen met het WindowActivate event, dat wordt afgevuurd als er wordt geswitcht naar een ander document, maar die gaat niet af als het het laatste document betreft. Kortom, daar is een probleem.

Het vreemde is dan nog dat als je kijkt in KB-artikel 302817, dat er blijkbaar wel ooit een close-event is geweest in Word 2000 en 2002. Hetzelfde artikel, maar dan voor Office 2007 (KB824022) is echter leeg en het close-event staat er dus ook niet bij. Ik weet niet of er wat mis is met dat artikel (ik zie niets staan in die rechthoeken) maar ook in Visual Studio bestaat er geen close event.

Heeft iemand een idee of ik een event over het hoofd zie, of het ergens anders is ondergebracht of heeft iemand sowieso een oplossing voor mijn probleem? Alvast bedankt! :).

Acties:
  • 0 Henk 'm!

Verwijderd

Als je iets verder op die pagina kijkt in het voorbeeld zie je dit staan:

oWord.DocumentBeforeClose +=
new Word.ApplicationEvents4_DocumentBeforeCloseEventHandler(
oWord_DocumentBeforeClose );

Kdenk dat dit is wat je zoekt ?

bye

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 16:25
Verwijderd schreef op dinsdag 03 maart 2009 @ 13:35:
Als je iets verder op die pagina kijkt in het voorbeeld zie je dit staan:

...
Nou, die wordt een beetje lastig, want dat event wordt afgevuurd ook vòòrdat een dialoogvenster verschijnt met wilt u opslaan ja/nee. Dus dan kan het nog geannuleerd worden, en dat kun je niet achterhalen.

Kortom, dit is voor mij geen bruikbaar event ;).

Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51
Dit lijkt hier prima te werken. Ik maak gebruik van het documentchange event en controleer dan of activedocument aanwezig is. Let wel, als er geen document geladen is krijg je een error om je oren. Vandaar de extra try catch er om heen.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
namespace WordAddIn1
{
   public partial class ThisAddIn
   {
      private void ThisAddIn_Startup(object sender, System.EventArgs e)
      {
         Application.DocumentChange += new Microsoft.Office.Interop.Word.ApplicationEvents4_DocumentChangeEventHandler(Application_DocumentChange);
      }

      void Application_DocumentChange()
      {
         try
         {
            Word.Document activeDoc = Application.ActiveDocument;          
            Application.StatusBar = "Enabled";
         }
         catch (Exception)
         {
            Application.StatusBar = "Disabled";
         }
      }

      private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
      {
         Application.DocumentChange -= new Microsoft.Office.Interop.Word.ApplicationEvents4_DocumentChangeEventHandler(Application_DocumentChange);
      }

      #region VSTO generated code

      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      private void InternalStartup()
      {
         this.Startup += new System.EventHandler(ThisAddIn_Startup);
         this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
      }

      #endregion
   }
}

http://hawvie.deviantart.com/


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:01

TeeDee

CQB 241

Is het dan niet netter om
C#:
1
2
3
4
5
6
7
8
9
Word.Document activeDoc = Application.ActiveDocument;          
if(activeDoc!=null)
{
   Application.StatusBar = "Enabled"; 
}
else 
{
   Application.StatusBar = "Disabled"; 
}
te gebruiken ipv Exceptions hier voor te (mis)(ge)bruiken?

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
TeeDee schreef op dinsdag 03 maart 2009 @ 20:45:
Is het dan niet netter om
C#:
1
2
3
4
5
6
7
8
9
Word.Document activeDoc = Application.ActiveDocument;          
if(activeDoc!=null)
{
   Application.StatusBar = "Enabled"; 
}
else 
{
   Application.StatusBar = "Disabled"; 
}
te gebruiken ipv Exceptions hier voor te (mis)(ge)bruiken?
Wat ik begrijp is dat de Getter ActiveDocument een Exception gooit in plaats van null returned. Dus je hebt dan niet zoveel keus, of er moet een andere manier zijn om van te voren te controleren of ActiveDocument niet gezet is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 13-09 16:51
TeeDee schreef op dinsdag 03 maart 2009 @ 20:45:
Is het dan niet netter om
C#:
1
2
3
4
5
6
7
8
9
Word.Document activeDoc = Application.ActiveDocument;          
if(activeDoc!=null)
{
   Application.StatusBar = "Enabled"; 
}
else 
{
   Application.StatusBar = "Disabled"; 
}
te gebruiken ipv Exceptions hier voor te (mis)(ge)bruiken?
Het zou beter zijn dat activedocument een null returned. Maar iemand bij Microsoft heeft besloten om een exceptie omhoog te gooien. Domme keuze volgens mij, omdat een .net exceptie die niet gecatchd wordt in de plugin automatisch zorgt voor een instabiel office pakket. Dus idd wat Woy zegt, by design.

http://hawvie.deviantart.com/


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:01

TeeDee

CQB 241

offtopic:
Ah, heb de documentatie niet gelezen. Een 'null' leek mij logischer, vandaar :) Als dit by design is, houdt het op natuurlijk.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 16:25
HawVer schreef op dinsdag 03 maart 2009 @ 14:22:
Dit lijkt hier prima te werken. Ik maak gebruik van het documentchange event en controleer dan of activedocument aanwezig is. Let wel, als er geen document geladen is krijg je een error om je oren. Vandaar de extra try catch er om heen.
Sorry voor mijn late reactie, kon het vandaag pas testen en inderdaad, je hebt gelijk. Ik had helemaal niet door dat er een exception werd gegooid, want die wordt een soort van genegeerd door Word. En daarom kwam mijn messagebox die eronder stond niet tevoorschijn. Dat had ik natuurlijk kunnen voorkomen door beter te debuggen 8)7.

Anyway, ik ben blij met je reactie en voorbeeld! Thanks! :).
Pagina: 1