Implementacja poleceń
Aby zaimplementować polecenie w programie VSPackage, należy wykonać następujące zadania:
W pliku .vsct skonfiguruj grupę poleceń, a następnie dodaj do niej polecenie. Aby uzyskać więcej informacji, zobacz pliki tabeli poleceń programu Visual Studio (vsct).
Zarejestruj polecenie w programie Visual Studio.
Zaimplementuj polecenie .
W poniższych sekcjach opisano sposób rejestrowania i implementowania poleceń.
Rejestrowanie poleceń w programie Visual Studio
Jeśli polecenie ma być wyświetlane w menu, musisz dodać element ProvideMenuResourceAttribute do pakietu VSPackage i użyć jako wartości albo nazwy menu lub jego identyfikatora zasobu.
[ProvideMenuResource("Menus.ctmenu", 1)]
public sealed class MyPackage : Package
{
// ...
}
Ponadto należy zarejestrować polecenie za pomocą polecenia OleMenuCommandService. Tę usługę można uzyskać przy użyciu GetService metody , jeśli pakiet VSPackage pochodzi z Packageklasy .
OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if (mcs is not null)
{
// Create the command for the menu item.
CommandID menuCommandID = new CommandID(guidCommandGroup, myCommandID);
MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID);
mcs.AddCommand(menuItem);
}
Implementowanie poleceń
Istnieje wiele sposobów implementowania poleceń. Jeśli chcesz, aby polecenie menu statycznego było poleceniem, które zawsze jest wyświetlane w taki sam sposób i w tym samym menu, utwórz polecenie przy użyciu polecenia MenuCommand , jak pokazano w przykładach w poprzedniej sekcji. Aby utworzyć statyczne polecenie, należy podać procedurę obsługi zdarzeń, która jest odpowiedzialna za wykonanie polecenia. Ponieważ polecenie jest zawsze włączone i widoczne, nie trzeba podawać jego stanu w programie Visual Studio. Jeśli chcesz zmienić stan polecenia w zależności od określonych warunków, możesz utworzyć polecenie jako wystąpienie OleMenuCommand klasy i w jego konstruktorze udostępnić program obsługi zdarzeń, aby wykonać polecenie i QueryStatus
program obsługi w celu powiadomienia programu Visual Studio o zmianie stanu polecenia. Możesz również zaimplementować IOleCommandTarget jako część klasy poleceń lub zaimplementować IVsHierarchy polecenie w ramach projektu. Dwa interfejsy i OleMenuCommand klasa mają wszystkie metody, które powiadamiają program Visual Studio o zmianie stanu polecenia, oraz inne metody, które zapewniają wykonanie polecenia.
Po dodaniu polecenia do usługi poleceń staje się jednym z łańcuchów poleceń. Podczas implementowania metod powiadamiania o stanie i wykonywania dla polecenia należy podać tylko dla tego konkretnego polecenia i przekazać wszystkie inne przypadki do innych poleceń w łańcuchu. Jeśli nie można przekazać polecenia (zwykle przez zwrócenie OLECMDERR_E_NOTSUPPORTEDpolecenia ), program Visual Studio może przestać działać prawidłowo.
Metody QueryStatus
Jeśli implementujesz metodę QueryStatus lub QueryStatusCommand metodę, sprawdź identyfikator GUID polecenia, do którego należy polecenie, i identyfikator polecenia. Postępuj zgodnie z tymi wytycznymi:
Jeśli identyfikator GUID nie jest rozpoznawany, implementacja jednej z metod musi zwrócić wartość OLECMDERR_E_UNKNOWNGROUP.
Jeśli implementacja jednej z metod rozpoznaje identyfikator GUID, ale nie zaimplementowała polecenia, metoda powinna zwrócić wartość OLECMDERR_E_NOTSUPPORTED.
Jeśli implementacja dowolnej metody rozpoznaje zarówno identyfikator GUID, jak i polecenie, metoda powinna ustawić pole command-flags każdego polecenia (w parametrze
prgCmds
) przy użyciu następujących OLECMDF flag:OLECMDF_SUPPORTED
: Polecenie jest obsługiwane.OLECMDF_INVISIBLE
: Polecenie nie powinno być widoczne.OLECMDF_LATCHED
: Polecenie jest włączone i wygląda na to, że zostało zaznaczone.OLECMDF_ENABLED
: Polecenie jest włączone.OLECMDF_DEFHIDEONCTXTMENU
: Polecenie powinno być ukryte, jeśli zostanie wyświetlone w menu skrótów.OLECMDF_NINCHED
: Polecenie jest kontrolerem menu i nie jest włączone, ale jego lista rozwijana nie jest pusta i jest nadal dostępna. (Ta flaga jest rzadko używana).
Jeśli polecenie zostało zdefiniowane w pliku vsct z flagą
TextChanges
, ustaw następujące parametry:rgwz
Ustaw element parametrupCmdText
na nowy tekst polecenia.cwActual
Ustaw element parametrupCmdText
na rozmiar ciągu polecenia.
Upewnij się również, że bieżący kontekst nie jest funkcją automatyzacji, chyba że polecenie jest specjalnie przeznaczone do obsługi funkcji automatyzacji.
Aby wskazać, że obsługujesz określone polecenie, zwróć polecenie S_OK. W przypadku wszystkich innych poleceń zwróć wartość OLECMDERR_E_NOTSUPPORTED.
W poniższym przykładzie metoda najpierw upewnia się, QueryStatus
że kontekst nie jest funkcją automatyzacji, a następnie znajduje prawidłowy identyfikator GUID zestawu poleceń i identyfikator polecenia. Samo polecenie ma być włączone i obsługiwane. Żadne inne polecenia nie są obsługiwane.
public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
if (!VsShellUtilities.IsInAutomationFunction(m_provider.ServiceProvider))
{
if (pguidCmdGroup == VSConstants.VSStd2K && cCmds > 0)
{
// make the Right command visible
if ((uint)prgCmds[0].cmdID == (uint)VSConstants.VSStd2KCmdID.RIGHT)
{
prgCmds[0].cmdf = (int)Microsoft.VisualStudio.OLE.Interop.Constants.MSOCMDF_ENABLED | (int)Microsoft.VisualStudio.OLE.Interop.Constants.MSOCMDF_SUPPORTED;
return VSConstants.S_OK;
}
}
}
return Constants.OLECMDERR_E_NOTSUPPORTED;
}
Metody wykonywania
Implementacja Exec
metody przypomina implementację QueryStatus
metody . Najpierw upewnij się, że kontekst nie jest funkcją automatyzacji. Następnie przetestuj identyfikator GUID i identyfikator polecenia. Jeśli identyfikator GUID lub identyfikator polecenia nie jest rozpoznawany, zwróć wartość OLECMDERR_E_NOTSUPPORTED.
Aby obsłużyć polecenie, wykonaj je i zwróć S_OK , jeśli wykonanie zakończy się pomyślnie. Twoje polecenie jest odpowiedzialne za wykrywanie błędów i powiadamianie; dlatego zwróć kod błędu, jeśli wykonanie zakończy się niepowodzeniem. W poniższym przykładzie pokazano, jak należy zaimplementować metodę wykonywania.
public int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
{
if (!VsShellUtilities.IsInAutomationFunction(m_provider.ServiceProvider))
{
if (pguidCmdGroup == VSConstants.GUID_VSStandardCommandSet97)
{
if (nCmdID == (uint)VSConstants.VSStd2KCmdID.RIGHT)
{
// execute the command
return VSConstants.S_OK;
}
}
}
return Constants.OLECMDERR_E_NOTSUPPORTED;
}