1

Je travaille dans Visual Studio 2008 et je souhaite que l'option Edition> Contour> Réduire dans les définitions soit exécutée à chaque fois que j'ouvre un fichier. Ce serait bien si, après cela, toutes les régions étaient élargies. J'ai essayé le code que Kyralessa a offert dans un commentaire sur The Problem with Code Folding, et cela fonctionne très bien comme une macro que je dois exécuter manuellement. J'ai essayé de développer cette macro pour agir comme un événement en plaçant le code suivant dans le module EnvironmentEvents dans l'IDE Macro:La macro EnvironmentEvent ne se termine pas

Public Sub documentEvents_DocumentOpened(ByVal Document As EnvDTE.Document) Handles DocumentEvents.DocumentOpened 
    Document.DTE.ExecuteCommand("Edit.CollapsetoDefinitions") 
    DTE.SuppressUI = True 
    Dim objSelection As TextSelection = DTE.ActiveDocument.Selection 
    objSelection.StartOfDocument() 
    Do While objSelection.FindText("#region", vsFindOptions.vsFindOptionsMatchInHiddenText) 
    Loop 
    objSelection.StartOfDocument() 
    DTE.SuppressUI = False 
End Sub 

Cependant, cela ne semble pas faire quoi que ce soit quand j'ouvrir un fichier de ma solution dans CONTRE. Pour tester que la macro était en cours d'exécution, j'ai mis une instruction MsgBox() dans ce sous-programme et j'ai remarqué que le code avant Document.DTE.ExecuteCommand("Edit.CollapsetoDefinitions") fonctionnait bien, mais rien ne semblait être touché après cette ligne. Lorsque je déboguais et définissais un point d'arrêt dans le sous-programme, j'appuyais sur F10 pour continuer à la ligne suivante et le contrôle quittait le sous-programme dès que la ligne ExecuteCommand était exécutée. Malgré cela, cette ligne semble ne rien faire, c'est-à-dire qu'elle ne s'effondre pas.

J'ai également essayé d'utiliser juste DTE.ExecuteCommand("Edit.CollapsetoDefinitions") dans le sous-programme, mais sans chance.

Cette question essaie d'obtenir le même résultat final que this one, mais je demande ce que je peux faire de mal dans ma macro de gestion d'événements.

Répondre

4

Le problème est que le document n'est pas vraiment actif lorsque l'événement se déclenche. Une solution consiste à utiliser un « feu une fois » minuterie pour exécuter le code un court délai après l'événement DocumentOpened est survenue:

Dim DocumentOpenedTimer As Timer 

Private Sub DocumentEvents_DocumentOpened(ByVal Document As EnvDTE.Document) Handles DocumentEvents.DocumentOpened 
    DocumentOpenedTimer = New Timer(AddressOf ExpandRegionsCallBack, Nothing, 200, Timeout.Infinite) 
End Sub 

Private Sub ExpandRegionsCallBack(ByVal state As Object) 
    ExpandRegions() 
    DocumentOpenedTimer.Dispose() 
End Sub 

Public Sub ExpandRegions() 
    Dim Document As EnvDTE.Document = DTE.ActiveDocument 
    If (Document.FullName.EndsWith(".vb") OrElse Document.FullName.EndsWith(".cs")) Then 
     If Not DTE.ActiveWindow.Caption.ToUpperInvariant.Contains("design".ToUpperInvariant) Then 
      Document.DTE.SuppressUI = True 
      Document.DTE.ExecuteCommand("Edit.CollapsetoDefinitions") 
      Dim objSelection As TextSelection = Document.Selection 
      objSelection.StartOfDocument() 
      Do While objSelection.FindText("#region", vsFindOptions.vsFindOptionsMatchInHiddenText) 
      Loop 
      objSelection.StartOfDocument() 
      Document.DTE.SuppressUI = False 
     End If 
    End If 
End Sub 

Je ne l'ai pas testé intensivement, donc il pourrait y avoir quelques bugs ... En outre, J'ai ajouté une vérification pour vérifier que le document actif est un code source C# ou VB (non testé avec VB) et qu'il n'est pas en mode conception.
En tout cas, espérons que cela fonctionne pour vous ...

+0

Merde, ça marche! J'ai dû ajouter une ligne 'Imports System.Threading' dans ma macro EnvironmentEvents pour' Timer' et 'Timeout', mais ça marche! J'ouvre mes fichiers CS maintenant et, après environ une seconde, toutes mes définitions sont effondrées. Merci! –

+0

J'ai remarqué que lorsque j'ouvre une nouvelle solution et qu'elle se souvient des fichiers que j'avais ouverts la dernière fois, la macro IDE doit fermer à cause d'une erreur. –

+0

Oui, j'ai aussi l'erreur. J'ai essayé de résoudre le problème mais je n'ai pas trouvé de solution et j'ai déjà passé trop de temps dessus. Si je pense à autre chose, je l'afficherai. En attendant, vous pouvez simplement utiliser un booléen (défini sur false dans l'événement Solution_Opened) pour activer/désactiver la fonction et la lier à un raccourci clavier. –

Questions connexes