Udostępnij za pośrednictwem


Udostępnianie poleceń

Po dodaniu wielu pakietów VSPackage do programu Visual Studio interfejs użytkownika może zostać przepełniony poleceniami. Pakiet można zaprogramować w celu zmniejszenia tego problemu w następujący sposób:

  • Zaprogramuj pakiet tak, aby był ładowany tylko wtedy, gdy użytkownik tego wymaga.

  • Zaprogramuj pakiet tak, aby jego polecenia były wyświetlane tylko wtedy, gdy mogą być wymagane w kontekście bieżącego stanu zintegrowanego środowiska projektowego (IDE).

Opóźnione ładowanie

Typowym sposobem włączenia opóźnionego ładowania jest zaprojektowanie pakietu VSPackage tak, aby jego polecenia są wyświetlane w interfejsie użytkownika, ale sam pakiet nie jest ładowany, dopóki użytkownik nie kliknie jednego z poleceń. Aby to osiągnąć, w pliku vsct utwórz polecenia, które nie mają flag poleceń.

W poniższym przykładzie przedstawiono definicję polecenia menu z pliku vsct. Jest to polecenie generowane przez szablon pakietu programu Visual Studio po wybraniu opcji Polecenie menu w szablonie.

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

W przykładzie, jeśli grupa nadrzędna, , jest elementem podrzędnym menu najwyższego poziomu, MyMenuGrouptakim jak menu Narzędzia , polecenie będzie widoczne w tym menu, ale pakiet, który wykonuje polecenie, nie zostanie załadowany, dopóki polecenie nie zostanie kliknięty przez użytkownika. Jednak programując polecenie w celu zaimplementowania interfejsu IOleCommandTarget , można włączyć ładowanie pakietu po pierwszym rozwinięciu menu zawierającego polecenie.

Zwróć uwagę, że opóźnione ładowanie może również poprawić wydajność uruchamiania.

Bieżący kontekst i widoczność poleceń

Polecenia VSPackage można programować tak, aby było widoczne lub ukryte, w zależności od bieżącego stanu danych pakietu VSPackage lub akcji, które są obecnie istotne. Pakiet VSPackage można włączyć, aby ustawić stan jego poleceń, zazwyczaj przy użyciu implementacji QueryStatus metody z interfejsu IOleCommandTarget , ale wymaga to załadowania pakietu VSPackage przed wykonaniem kodu. Zamiast tego zalecamy włączenie środowiska IDE do zarządzania widocznością poleceń bez ładowania pakietu. W tym celu w pliku vsct skojarz polecenia z co najmniej jednym specjalnym kontekstem interfejsu użytkownika. Te konteksty interfejsu użytkownika są identyfikowane przez identyfikator GUID znany jako identyfikator GUID kontekstu polecenia.

Program Visual Studio monitoruje zmiany wynikające z akcji użytkownika, takich jak ładowanie projektu lub przechodzenie z edycji do budynku. W miarę wprowadzania zmian wygląd środowiska IDE jest automatycznie modyfikowany. W poniższej tabeli przedstawiono cztery główne konteksty zmiany środowiska IDE monitorowane przez program Visual Studio.

Typ kontekstu opis
Typ aktywnego projektu W przypadku większości typów projektów ta GUID wartość jest taka sama jak identyfikator GUID pakietu VSPackage, który implementuje projekt. Jednak projekty Visual C++ używają typu GUID projektu jako wartości.
Aktywne okno Zazwyczaj jest to ostatnie aktywne okno dokumentu, które ustanawia bieżący kontekst interfejsu użytkownika dla powiązań kluczy. Może to być jednak również okno narzędzi z tabelą powiązań kluczy przypominającą wewnętrzną przeglądarkę sieci Web. W przypadku okien dokumentów z wieloma kartami, takich jak edytor HTML, każda karta ma inny kontekst GUIDpolecenia .
Aktywna usługa językowa Usługa językowa skojarzona z plikiem, który jest obecnie wyświetlany w edytorze tekstów.
Aktywne okno narzędzia Otwarte okno narzędzi i fokus.

Piąty główny obszar kontekstu to stan interfejsu użytkownika środowiska IDE. Konteksty interfejsu użytkownika są identyfikowane przez aktywne konteksty GUIDpoleceń w następujący sposób:

Te identyfikatory GUID są oznaczone jako aktywne lub nieaktywne w zależności od bieżącego stanu środowiska IDE. Wiele kontekstów interfejsu użytkownika może być aktywnych w tym samym czasie.

Ukrywanie i wyświetlanie poleceń na podstawie kontekstu

Możesz wyświetlić lub ukryć polecenie pakietu w środowisku IDE bez ładowania samego pakietu. W tym celu zdefiniuj polecenie w pliku vsct pakietu przy użyciu DefaultDisabledflag poleceń , DefaultInvisiblei DynamicVisibility i dodając co najmniej jeden element VisibilityItem do sekcji Ograniczenia widoczności. Gdy określony kontekst GUID polecenia stanie się aktywny, polecenie jest wyświetlane bez ładowania pakietu.

Niestandardowe identyfikatory GUID kontekstu

Jeśli nie zdefiniowano jeszcze odpowiedniego identyfikatora GUID kontekstu polecenia, możesz zdefiniować go w pakietach VSPackage, a następnie zaprogramować go tak, aby był aktywny lub nieaktywny zgodnie z wymaganiami w celu kontrolowania widoczności poleceń. SVsShellMonitorSelection Użyj usługi, aby:

  • Zarejestruj identyfikatory GUID kontekstu (wywołując metodę GetCmdUIContextCookie ).

  • Pobierz stan kontekstu GUID (wywołując metodę IsCmdUIContextActive ).

  • Włącz i wyłącz kontekst GUID(wywołując metodę SetCmdUIContext ).

    Uwaga

    Upewnij się, że pakiet VSPackage nie ma wpływu na stan istniejącego identyfikatora GUID kontekstu, ponieważ inne pakiety VSPackage mogą od nich zależeć.

Przykład

Poniższy przykład polecenia VSPackage demonstruje dynamiczną widoczność polecenia zarządzanego przez konteksty poleceń bez ładowania pakietu VSPackage.

Polecenie ma być włączone i wyświetlane za każdym razem, gdy istnieje rozwiązanie; oznacza to, że za każdym razem, gdy jeden z następujących identyfikatorów GUID kontekstu polecenia jest aktywny:

W tym przykładzie zwróć uwagę, że każda flaga polecenia jest oddzielnym elementem flagi polecenia.

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

Należy również zauważyć, że każdy kontekst interfejsu użytkownika musi być podany w osobnym VisibilityItem elemecie w następujący sposób.

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