Befehlsroutingalgorithmus
In Visual Studio-Befehlen werden mehrere unterschiedliche Komponenten behandelt. Befehle werden vom innersten Kontext, der auf der aktuellen Auswahl basiert, an den äußersten Kontext (auch als global bezeichnet) weitergeleitet. Weitere Informationen finden Sie unter "Befehlsverfügbarkeit".
Reihenfolge der Befehlsauflösung
Befehle werden über die folgenden Ebenen des Befehlskontexts übergeben:
Add-Ins: Die Umgebung bietet zunächst den Befehl für add-ins, die vorhanden sind.
Prioritätsbefehle: Diese Befehle werden mithilfe IVsRegisterPriorityCommandTargetvon . Sie werden für jeden Befehl in Visual Studio aufgerufen und in der Reihenfolge aufgerufen, in der sie registriert wurden.
Kontextmenübefehle: Ein Befehl, der sich in einem Kontextmenü befindet, wird zuerst dem Befehlsziel angeboten, das für das Kontextmenü bereitgestellt wird, und danach zum typischen Routing.
Befehlsziele für Symbolleistensatz: Diese Befehlsziele werden beim Aufrufen SetupToolbar2registriert. Der
pCmdTarget
Parameter kann seinnull
. Wenn dies nichtnull
der Fall ist, wird dieses Befehlsziel verwendet, um alle Befehle auf der Symbolleiste zu aktualisieren, die Sie einrichten. Wenn die Shell die Symbolleiste einführt, übergibt sie den Fensterrahmen sopCmdTarget
, dass alle Aktualisierungen der Befehle auf der Symbolleiste über den Fensterrahmen fließen, auch wenn sie nicht im Fokus ist.Toolfenster: Toolfenster, die normalerweise die IVsWindowPane Schnittstelle implementieren, sollten auch die IOleCommandTarget Schnittstelle implementieren, damit Visual Studio das Befehlsziel abrufen kann, wenn das Toolfenster das aktive Fenster ist. Wenn das Toolfenster, das den Fokus besitzt, jedoch das Projektfenster ist, wird der Befehl an die IVsUIHierarchy Schnittstelle weitergeleitet, die das gemeinsame übergeordnete Element der ausgewählten Elemente ist. Wenn diese Auswahl mehrere Projekte umfasst, wird der Befehl an die IVsSolution Hierarchie weitergeleitet. Die IVsUIHierarchy Schnittstelle enthält die QueryStatusCommand und ExecCommand die Methoden, die den entsprechenden Befehlen auf der IOleCommandTarget Schnittstelle entsprechen.
Dokumentfenster: Wenn der Befehl das Kennzeichen in der
RouteToDocs
VSCT-Datei festgelegt hat, sucht Visual Studio nach einem Befehlsziel für das Dokumentansichtsobjekt, bei dem es sich entweder um eine Instanz einer IVsWindowPane Schnittstelle oder eine Instanz eines Dokumentobjekts handelt (in der Regel eine IVsTextLines Schnittstelle oder eine IVsTextBuffer Schnittstelle). Wenn das Dokumentansichtsobjekt den Befehl nicht unterstützt, leitet Visual Studio den Befehl an die IOleCommandTarget zurückgegebene Schnittstelle weiter. (Dies ist eine optionale Schnittstelle für Dokumentdatenobjekte.)Aktuelle Hierarchie: Die aktuelle Hierarchie kann das Projekt sein, das das aktive Dokumentfenster oder die Hierarchie besitzt, die in Projektmappen-Explorer ausgewählt ist. Visual Studio sucht nach der IOleCommandTarget Schnittstelle, die in der aktuellen oder aktiven Hierarchie implementiert ist. Die Hierarchie sollte Befehle unterstützen, die gültig sind, wenn die Hierarchie aktiv ist, auch wenn ein Dokumentfenster eines Projektelements den Fokus hat. Befehle, die nur angewendet werden, wenn Projektmappen-Explorer den Fokus hat, müssen jedoch mithilfe der IVsUIHierarchy Schnittstelle und der zugehörigen QueryStatusCommand Methoden ExecCommand unterstützt werden.
Befehle "Ausschneiden", "Kopieren", "Einfügen", "Löschen", "Umbenennen", "Eingabetaste" und "DoubleClick" erfordern eine spezielle Behandlung. Informationen zum Behandeln von Befehlen zum Löschen und Entfernen in Hierarchien finden Sie in der IVsHierarchyDeleteHandler Schnittstelle.
Global: Wenn ein Befehl nicht von den zuvor Erwähnung kontextierten Kontexten behandelt wurde, versucht Visual Studio, ihn an den VSPackage weiterzuleiten, der einen Befehl besitzt, der die IOleCommandTarget Schnittstelle implementiert. Wenn das VSPackage noch nicht geladen wurde, wird es nicht geladen, wenn Visual Studio die QueryStatus Methode aufruft. Die VSPackage wird nur geladen, wenn die Exec Methode aufgerufen wird.