Condividi tramite


Algoritmo di routing dei comandi

Nei comandi di Visual Studio vengono gestiti da diversi componenti. I comandi vengono instradati dal contesto più interno, basato sulla selezione corrente, al contesto più esterno (noto anche come globale). Per altre informazioni, vedere Disponibilità dei comandi.

Ordine di risoluzione dei comandi

I comandi vengono passati attraverso i livelli seguenti del contesto di comando:

  1. Componenti aggiuntivi: l'ambiente offre innanzitutto il comando a tutti i componenti aggiuntivi presenti.

  2. Comandi di priorità: questi comandi vengono registrati tramite IVsRegisterPriorityCommandTarget. Vengono chiamati per ogni comando in Visual Studio e vengono chiamati nell'ordine in cui sono stati registrati.

  3. Comandi di menu di scelta rapida: un comando che si trova in un menu di scelta rapida viene prima offerto alla destinazione del comando fornita al menu di scelta rapida e successivamente al routing tipico.

  4. Destinazioni comando impostate sulla barra degli strumenti: queste destinazioni di comando vengono registrate quando si chiama SetupToolbar2. Il pCmdTarget parametro può essere null. Se non nullè , questa destinazione comando viene usata per aggiornare tutti i comandi presenti sulla barra degli strumenti che si sta configurando. Se la shell sta configurando la barra degli strumenti, passa la cornice della finestra come in pCmdTarget modo che tutti gli aggiornamenti ai comandi della barra degli strumenti scorrono attraverso la cornice della finestra, anche quando non è attiva.

  5. Finestra degli strumenti: le finestre degli strumenti, che in genere implementano l'interfaccia IVsWindowPane , devono implementare anche l'interfaccia IOleCommandTarget in modo che Visual Studio possa ottenere la destinazione del comando quando la finestra degli strumenti è la finestra attiva. Tuttavia, se la finestra degli strumenti con stato attivo è la finestra Progetto , il comando viene indirizzato all'interfaccia IVsUIHierarchy padre comune degli elementi selezionati. Se questa selezione si estende su più progetti, il comando viene indirizzato alla IVsSolution gerarchia. L'interfaccia IVsUIHierarchy contiene i QueryStatusCommand metodi e ExecCommand analoghi ai comandi corrispondenti nell'interfaccia IOleCommandTarget .

  6. Finestra documento: se il comando ha il RouteToDocs flag impostato nel relativo file con estensione vsct , Visual Studio cerca una destinazione di comando nell'oggetto visualizzazione documento, ovvero un'istanza di un'interfaccia IVsWindowPane o un'istanza di un oggetto documento (in genere un'interfaccia IVsTextLines o un'interfaccia IVsTextBuffer ). Se l'oggetto visualizzazione documento non supporta il comando, Visual Studio instrada il comando all'interfaccia IOleCommandTarget restituita. Si tratta di un'interfaccia facoltativa per gli oggetti dati del documento.

  7. Gerarchia corrente: la gerarchia corrente può essere il progetto proprietario della finestra del documento attiva o della gerarchia selezionata in Esplora soluzioni. Visual Studio cerca l'interfaccia IOleCommandTarget implementata nella gerarchia corrente o attiva. La gerarchia deve supportare i comandi validi ogni volta che la gerarchia è attiva, anche se una finestra documento di un elemento di progetto ha lo stato attivo. Tuttavia, i comandi che si applicano solo quando Esplora soluzioni ha lo stato attivo devono essere supportati tramite l'interfaccia IVsUIHierarchy e i relativi QueryStatusCommand metodi e ExecCommand .

    I comandi Taglia, Copia, Incolla, Elimina, Rinomina, Invio e DoubleClick richiedono una gestione speciale. Per informazioni su come gestire i comandi Elimina e Rimuovi nelle gerarchie, vedere l'interfaccia IVsHierarchyDeleteHandler .

  8. Globale: se un comando non è stato gestito dai contesti indicati in precedenza, Visual Studio tenta di instradarlo al VSPackage proprietario di un comando che implementa l'interfaccia IOleCommandTarget . Se il pacchetto VSPackage non è già stato caricato, non viene caricato quando Visual Studio chiama il QueryStatus metodo . Il pacchetto VSPackage viene caricato solo quando viene chiamato il Exec metodo .