Abonnement à un événement

Cette procédure pas à pas explique comment créer une fenêtre d’outil qui répond aux événements d’une table de documents en cours d’exécution (RDT). Une fenêtre d’outil héberge un contrôle utilisateur qui implémente IVsRunningDocTableEvents. La AdviseRunningDocTableEvents méthode connecte l’interface aux événements.

Abonnement aux événements RDT

Pour créer une extension avec une fenêtre d’outil

  1. Créez un projet nommé RDTExplorer à l’aide du modèle VSIX et ajoutez un modèle d’élément de fenêtre d’outil personnalisé nommé RDTExplorerWindow.

    Pour plus d’informations sur la création d’une extension avec une fenêtre d’outil, consultez Création d’une extension avec une fenêtre Outil.

Pour vous abonner aux événements RDT

  1. Ouvrez le fichier RDTExplorerWindowControl.xaml et supprimez le bouton nommé button1. Ajoutez un ListBox contrôle et acceptez le nom par défaut. L’élément Grid doit ressembler à ceci :

    <Grid>
        <StackPanel Orientation="Vertical" Margin="-10,10,10,0">
            <TextBlock Margin="10" HorizontalAlignment="Center">RDTExplorerWindow</TextBlock>
            <ListBox x:Name="listBox" Height="100" />
        </StackPanel>
    </Grid>
    
  2. Ouvrez le fichier RDTExplorerWindow.cs en mode code. Ajoutez les directives using suivantes au début du fichier.

    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. Modifiez la RDTExplorerWindow classe afin qu’en plus de dériver de la ToolWindowPane classe, elle implémente l’interface IVsRunningDocTableEvents .

    public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents
    {. . .}
    
  4. Implémentez IVsRunningDocTableEvents.

    • Implémentez l'interface . Placez le curseur sur le nom IVsRunningDocTableEvents. Vous devriez voir une ampoule dans la marge gauche. Cliquez sur la flèche vers le bas à droite de l’ampoule, puis sélectionnez Implémenter l’interface.
  5. Dans chaque méthode de l’interface, remplacez la ligne throw new NotImplementedException(); par ceci :

    return VSConstants.S_OK;
    
  6. Ajoutez un champ de cookie à la classe RDTExplorerWindow.

    private uint rdtCookie;
    

    Cela contient le cookie retourné par la AdviseRunningDocTableEvents méthode.

  7. Remplacez la méthode Initialize() de RDTExplorerWindow pour s’inscrire aux événements RDT. Vous devez toujours obtenir des services dans la méthode Initialize() de ToolWindowPane, et non dans le constructeur.

    protected override void Initialize()
    {
        IVsRunningDocumentTable rdt = (IVsRunningDocumentTable)
        this.GetService(typeof(SVsRunningDocumentTable));
        rdt.AdviseRunningDocTableEvents(this, out rdtCookie);
    }
    

    Le SVsRunningDocumentTable service est appelé pour obtenir une IVsRunningDocumentTable interface. La AdviseRunningDocTableEvents méthode connecte des événements RDT à un objet qui implémente IVsRunningDocTableEvents, dans ce cas, un objet RDTExplorer.

  8. Mettez à jour la méthode Dispose() de RDTExplorerWindow.

    protected override void Dispose(bool disposing)
    {
        // Release the RDT cookie.
        IVsRunningDocumentTable rdt = (IVsRunningDocumentTable)
            Package.GetGlobalService(typeof(SVsRunningDocumentTable));
        rdt.UnadviseRunningDocTableEvents(rdtCookie);
    
        base.Dispose(disposing);
    }
    

    La UnadviseRunningDocTableEvents méthode supprime la connexion entre RDTExplorer et la notification d’événement RDT.

  9. Ajoutez la ligne suivante au corps du OnBeforeLastDocumentUnlock gestionnaire, juste avant l’instruction return .

    public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock");
        return VSConstants.S_OK;
    }
    
  10. Ajoutez une ligne similaire au corps du OnAfterFirstDocumentLock gestionnaire et à d’autres événements que vous souhaitez afficher dans la zone de liste.

    public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock");
        return VSConstants.S_OK;
    }
    
  11. Générez le projet et commencez le débogage. L’instance expérimentale de Visual Studio s’affiche.

  12. Ouvrez RDTExplorerWindow (Affichage / Autres Fenêtres / RDTExplorerWindow).

    La fenêtre RDTExplorerWindow s’ouvre avec une liste d’événements vide.

  13. Ouvrez ou créez une solution.

    À mesure que OnBeforeLastDocument les OnAfterFirstDocument événements sont déclenchés, la notification de chaque événement apparaît dans la liste des événements.