Share via


Bereitstellen von Befehlen

Wenn visual Studio mehrere VSPackages hinzugefügt werden, wird die Benutzeroberfläche (UI) möglicherweise mit Befehlen überlastet. Sie können Ihr Paket so programmieren, dass dieses Problem wie folgt reduziert wird:

  • Programmieren Sie das Paket so, dass es nur geladen wird, wenn ein Benutzer es benötigt.

  • Programmieren Sie das Paket so, dass ihre Befehle nur angezeigt werden, wenn sie im Kontext des aktuellen Zustands der integrierten Entwicklungsumgebung (IDE) erforderlich sein können.

Verzögertes Laden

Die typische Möglichkeit zum Aktivieren des verzögerten Ladens besteht darin, das VSPackage so zu entwerfen, dass seine Befehle in der Benutzeroberfläche angezeigt werden, das Paket selbst jedoch erst geladen wird, wenn ein Benutzer auf einen der Befehle klickt. Erstellen Sie dazu in der VSCT-Datei Befehle ohne Befehlskennzeichnungen.

Das folgende Beispiel zeigt die Definition eines Menübefehls aus einer VSCT-Datei. Dies ist der Befehl, der von der Visual Studio-Paketvorlage generiert wird, wenn die Menübefehlsoption in der Vorlage ausgewählt ist.

<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>

Wenn die übergeordnete Gruppe MyMenuGroupim Beispiel ein untergeordnetes Element eines Menüs der obersten Ebene ist, z. B. das Menü "Extras ", wird der Befehl in diesem Menü angezeigt, aber das Paket, das den Befehl ausführt, wird erst geladen, wenn der Befehl von einem Benutzer geklickt wird. Durch Programmieren des Befehls zum Implementieren der IOleCommandTarget Schnittstelle können Sie jedoch das Laden des Pakets aktivieren, wenn das Menü, das den Befehl enthält, zuerst erweitert wird.

Beachten Sie, dass das verzögerte Laden auch die Startleistung verbessern kann.

Aktueller Kontext und Sichtbarkeit von Befehlen

Sie können VSPackage-Befehle so programmieren, dass sie sichtbar oder ausgeblendet werden, abhängig vom aktuellen Status der VSPackage-Daten oder der aktuell relevanten Aktionen. Sie können das VSPackage aktivieren, um den Status seiner Befehle festzulegen, in der Regel mithilfe einer Implementierung der Methode über die QueryStatusIOleCommandTarget Schnittstelle, dies erfordert jedoch, dass das VSPackage geladen wird, bevor er den Code ausführen kann. Stattdessen wird empfohlen, die IDE zu aktivieren, um die Sichtbarkeit der Befehle zu verwalten, ohne das Paket zu laden. Ordnen Sie dazu in der VSCT-Datei Befehle einem oder mehreren speziellen UI-Kontexten zu. Diese UI-Kontexte werden durch eine GUID identifiziert, die als Befehlskontext-GUID bezeichnet wird.

Visual Studio überwacht Änderungen, die aus Benutzeraktionen wie dem Laden eines Projekts oder vom Bearbeiten zum Erstellen resultieren. Wenn Änderungen vorgenommen werden, wird die Darstellung der IDE automatisch geändert. Die folgende Tabelle zeigt vier Hauptkontexte von IDE-Änderungen, die Visual Studio überwacht.

Kontexttyp Beschreibung
Aktiver Projekttyp Für die meisten Projekttypen ist dieser GUID Wert identisch mit der GUID des VSPackage, das das Projekt implementiert. Visual C++-Projekte verwenden jedoch den Projekttyp GUID als Wert.
Aktives Fenster In der Regel ist dies das letzte aktive Dokumentfenster, das den aktuellen Ui-Kontext für Tastenbindungen festlegt. Es kann jedoch auch ein Toolfenster sein, das über eine Schlüsselbindungstabelle verfügt, die dem internen Webbrowser ähnelt. Bei Dokumentfenstern mit mehreren Registerkarten wie dem HTML-Editor weist jede Registerkarte einen anderen Befehlskontext auf GUID.
Aktiver Sprachdienst Der Sprachdienst, der der Datei zugeordnet ist, die derzeit in einem Text-Editor angezeigt wird.
Aktives Toolfenster Ein Toolfenster, das geöffnet ist und den Fokus hat.

Ein fünfter Hauptkontextbereich ist der UI-Zustand der IDE. Ui-Kontexte werden durch aktive Befehlskontexte GUIDwie folgt identifiziert:

Diese GUIDs werden abhängig vom aktuellen Status der IDE als aktiv oder inaktiv markiert. Mehrere UI-Kontexte können gleichzeitig aktiv sein.

Ausblenden und Anzeigen von Befehlen basierend auf Kontext

Sie können einen Paketbefehl in der IDE anzeigen oder ausblenden, ohne das Paket selbst zu laden. Definieren Sie dazu den Befehl in der VSCT-Datei des Pakets mithilfe der DefaultDisabledDefaultInvisibleFlags , und DynamicVisibility Befehlskennzeichnungen, und fügen Sie dem Abschnitt "VisibilityConstraints" ein oder mehrere VisibilityItem-Elemente hinzu. Wenn ein angegebener Befehlskontext GUID aktiv wird, wird der Befehl angezeigt, ohne das Paket zu laden.

Benutzerdefinierte Kontext-GUIDs

Wenn eine entsprechende Befehlskontext-GUID noch nicht definiert ist, können Sie eine in Ihrem VSPackage definieren und dann so programmieren, dass sie wie erforderlich aktiv oder inaktiv ist, um die Sichtbarkeit Ihrer Befehle zu steuern. Verwenden Sie den SVsShellMonitorSelection Dienst für:

  • Registrieren sie Kontext-GUIDs (durch Aufrufen der GetCmdUIContextCookie Methode).

  • Rufen Sie den Status eines Kontexts GUID ab (durch Aufrufen der IsCmdUIContextActive Methode).

  • Aktivieren und Deaktivieren von Kontexten GUID(durch Aufrufen der SetCmdUIContext Methode).

    Achtung

    Stellen Sie sicher, dass ihr VSPackage den Status einer vorhandenen Kontext-GUID nicht beeinflusst, da andere VSPackages davon abhängig sein können.

Beispiel

Im folgenden Beispiel eines VSPackage-Befehls wird die dynamische Sichtbarkeit eines Befehls veranschaulicht, der von Befehlskontexten verwaltet wird, ohne das VSPackage-Steuerelement zu laden.

Der Befehl ist so eingestellt, dass er aktiviert und angezeigt wird, wenn eine Lösung vorhanden ist; das heißt, wenn eine der folgenden Befehlskontext-GUIDs aktiv ist:

Beachten Sie im Beispiel, dass jedes Befehlsflaggen ein separates Befehlskennzeichnungselement ist.

<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>

Beachten Sie außerdem, dass jeder Ui-Kontext in einem separaten VisibilityItem Element wie folgt angegeben werden muss.

<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>