Condividi tramite


Rendere disponibili i comandi

Quando più pacchetti VSPackage vengono aggiunti a Visual Studio, l'interfaccia utente può diventare sovraffollata con i comandi. È possibile programmare il pacchetto per ridurre questo problema, come indicato di seguito:

  • Programmare il pacchetto in modo che venga caricato solo quando un utente lo richiede.

  • Programmare il pacchetto in modo che i relativi comandi vengano visualizzati solo quando potrebbero essere necessari nel contesto dello stato corrente dell'ambiente di sviluppo integrato (IDE).

Caricamento ritardato

Il modo tipico per abilitare il caricamento ritardato consiste nel progettare il VSPackage in modo che i relativi comandi vengano visualizzati nell'interfaccia utente, ma il pacchetto stesso non viene caricato fino a quando un utente non fa clic su uno dei comandi. A tale scopo, nel file con estensione vsct creare comandi senza flag di comando.

Nell'esempio seguente viene illustrata la definizione di un comando di menu da un file con estensione vsct. Questo è il comando generato dal modello di pacchetto di Visual Studio quando è selezionata l'opzione Comando di menu nel modello.

<Button guid="guidTopLevelMenuCmdSet" id="cmdidTestCommand" priority="0x0100" type="Button">
  <Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <Strings>
    <CommandName>cmdidTestCommand</CommandName>
    <ButtonText>Test Command</ButtonText>
  </Strings>
</Button>

Nell'esempio, se il gruppo padre, MyMenuGroup, è un elemento figlio di un menu di primo livello, ad esempio il menu Strumenti , il comando sarà visibile nel menu, ma il pacchetto che esegue il comando non verrà caricato finché il comando non viene selezionato da un utente. Tuttavia, programmando il comando per implementare l'interfaccia IOleCommandTarget , è possibile abilitare il pacchetto da caricare quando il menu che contiene il comando viene espanso per la prima volta.

Si noti che il caricamento ritardato può anche migliorare le prestazioni di avvio.

Contesto corrente e visibilità dei comandi

È possibile programmare i comandi VSPackage da visualizzare o nascondere, a seconda dello stato corrente dei dati VSPackage o delle azioni attualmente rilevanti. È possibile abilitare il VSPackage per impostare lo stato dei relativi comandi, in genere usando un'implementazione del QueryStatus metodo dall'interfaccia IOleCommandTarget , ma questo richiede che il VSPackage venga caricato prima di poter eseguire il codice. È invece consigliabile abilitare l'IDE per gestire la visibilità dei comandi senza caricare il pacchetto. A tale scopo, nel file vsct associare i comandi a uno o più contesti speciali dell'interfaccia utente. Questi contesti dell'interfaccia utente sono identificati da un GUID noto come GUID del contesto di comando.

Visual Studio monitora le modifiche risultanti da azioni dell'utente, ad esempio il caricamento di un progetto o il passaggio dalla modifica alla compilazione. Quando si verificano modifiche, l'aspetto dell'IDE viene modificato automaticamente. La tabella seguente illustra quattro contesti principali di modifica dell'IDE monitorati da Visual Studio.

Tipo di contesto Descrizione
Tipo di progetto attivo Per la maggior parte dei tipi di progetto, questo GUID valore corrisponde al GUID del VSPackage che implementa il progetto. Tuttavia, i progetti Visual C++ usano il tipo di GUID progetto come valore.
Finestra attiva In genere, si tratta dell'ultima finestra del documento attiva che stabilisce il contesto dell'interfaccia utente corrente per le associazioni di tasti. Tuttavia, potrebbe anche essere una finestra degli strumenti con una tabella di associazione di tasti simile al Web browser interno. Per le finestre dei documenti a schede diverse, ad esempio l'editor HTML, ogni scheda ha un contesto GUIDdi comando diverso.
Servizio di linguaggio attivo Servizio linguistico associato al file attualmente visualizzato in un editor di testo.
Finestra degli strumenti attiva Finestra degli strumenti aperta e con stato attivo.

Una quinta area di contesto principale è lo stato dell'interfaccia utente dell'IDE. I contesti dell'interfaccia utente vengono identificati dal contesto GUIDdi comando attivo, come indicato di seguito:

Questi GUID sono contrassegnati come attivi o inattivi, a seconda dello stato corrente dell'IDE. Più contesti dell'interfaccia utente possono essere attivi contemporaneamente.

Nascondere e visualizzare i comandi in base al contesto

È possibile visualizzare o nascondere un comando del pacchetto nell'IDE senza caricare il pacchetto stesso. A tale scopo, definire il comando nel file vsct del pacchetto usando i DefaultDisabledflag di comando , DefaultInvisiblee e DynamicVisibility aggiungendo uno o più elementi VisibilityItem alla sezione VisibilityConstraints . Quando un contesto GUID di comando specificato diventa attivo, il comando viene visualizzato senza caricare il pacchetto.

GUID di contesto personalizzati

Se un GUID del contesto di comando appropriato non è già definito, è possibile definirne uno nel pacchetto VSPackage e quindi programmarlo in modo che sia attivo o inattivo in base alle esigenze per controllare la visibilità dei comandi. Usare il SVsShellMonitorSelection servizio per:

  • Registrare i GUID del contesto (chiamando il GetCmdUIContextCookie metodo ).

  • Ottenere lo stato di un contesto GUID chiamando il IsCmdUIContextActive metodo .

  • Attivare e disattivare il contesto GUID(chiamando il SetCmdUIContext metodo ).

    Attenzione

    Assicurarsi che il VSPackage non influisca sullo stato di un GUID di contesto esistente perché altri pacchetti VSPackage possono dipendere da essi.

Esempio

L'esempio seguente di un comando VSPackage illustra la visibilità dinamica di un comando gestito dai contesti di comando senza caricare il pacchetto VSPackage.

Il comando è impostato per essere abilitato e visualizzato ogni volta che esiste una soluzione; ovvero, ogni volta che è attivo uno dei GUID del contesto di comando seguenti:

Nell'esempio si noti che ogni flag di comando è un elemento Command Flag separato.

<Button guid="guidDynamicVisibilityCmdSet" id="cmdidMyCommand"
        priority="0x0100" type="Button">
  <Parent guid="guidDynamicVisibilityCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <CommandFlag>DefaultDisabled</CommandFlag>
  <CommandFlag>DefaultInvisible</CommandFlag>
  <CommandFlag>DynamicVisibility</CommandFlag>
  <Strings>
    <CommandName>cmdidMyCommand</CommandName>
    <ButtonText>My Command name</ButtonText>
  </Strings>
</Button>

Si noti anche che ogni contesto dell'interfaccia utente deve essere specificato in un elemento separato VisibilityItem , come indicato di seguito.

<VisibilityConstraints>
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                  id="cmdidMyCommand" context="UICONTEXT_EmptySolution" />
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                      id="cmdidMyCommand" context="UICONTEXT_SolutionHasSingleProject" />
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                  id="cmdidMyCommand" context="UICONTEXT_SolutionHasMultipleProjects" />
</VisibilityConstraints>