Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ha a VSPackage-ben szeretne parancsot implementálni, a következő feladatokat kell elvégeznie:
A .vsct fájlban állítson be egy parancscsoportot, majd adja hozzá a parancsot. További információ: Visual Studio command table (.vsct) fájlok.
Regisztrálja a parancsot a Visual Studióban.
Implementálja a parancsot.
A következő szakaszok a parancsok regisztrálását és implementálását ismertetik.
Parancsok regisztrálása a Visual Studióval
Ha a parancs egy menüben jelenik meg, hozzá kell adnia a ProvideMenuResourceAttribute VSPackage-hoz, és értékként kell használnia a menü nevét vagy erőforrás-azonosítóját.
[ProvideMenuResource("Menus.ctmenu", 1)]
public sealed class MyPackage : Package
{
// ...
}
Emellett regisztrálnia kell a parancsot a OleMenuCommandService. Ezt a szolgáltatást azzal a GetService metódussal szerezheti be, ha a VSPackage a Package osztályból van származtatva.
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);
}
Parancsok implementálása
A parancsok többféleképpen is implementálhatóak. Ha statikus menüparancsot szeretne, amely egy olyan parancs, amely mindig ugyanúgy és ugyanazon a menün jelenik meg, hozza létre a parancsot MenuCommand az előző szakaszban bemutatott példáknak megfelelően. Statikus parancs létrehozásához meg kell adnia egy eseménykezelőt, amely felelős a parancs végrehajtásáért. Mivel a parancs mindig engedélyezve és látható, nem kell megadnia az állapotát a Visual Studiónak. Ha bizonyos feltételektől függően módosítani szeretné egy parancs állapotát, létrehozhatja a parancsot az OleMenuCommand osztály példányaként, és konstruktorában adjon meg egy eseménykezelőt a parancs végrehajtásához, valamint egy kezelőt QueryStatus , amely értesíti a Visual Studiót a parancs állapotának változásáról. A parancsosztály részeként is implementálható IOleCommandTarget , vagy implementálható IVsHierarchy , ha egy projekt részeként ad meg parancsot. A két felület és az OleMenuCommand osztály mind olyan metódusokkal rendelkezik, amelyek értesítik a Visual Studiót egy parancs állapotának változásáról, és más metódusokkal, amelyek biztosítják a parancs végrehajtását.
Amikor hozzáad egy parancsot a parancsszolgáltatáshoz, az a parancsláncok egyikévé válik. Amikor implementálja a parancs állapotértesítési és végrehajtási módszereit, ügyeljen arra, hogy csak az adott parancsot adja meg, és az összes többi esetet továbbítsa a lánc többi parancsának. Ha nem továbbítja a parancsot (tipikusan a OLECMDERR_E_NOTSUPPORTED visszaadása által), előfordulhat, hogy a Visual Studio nem működik megfelelően.
QueryStatus metódusok
Ha a metódust vagy a QueryStatusQueryStatusCommand metódust implementálja, ellenőrizze annak a parancskészletnek a GUID-azonosítóját, amelyhez a parancs tartozik, valamint a parancs azonosítóját. Kövesse az alábbi irányelveket:
Ha a GUID nem ismerhető fel, a metódus implementálásának OLECMDERR_E_UNKNOWNGROUP-t kell visszaadnia.
Ha bármelyik metódus implementálása felismeri a GUID-t, de nem implementálta a parancsot, akkor a metódusnak vissza kell térnie OLECMDERR_E_NOTSUPPORTED.
Ha bármelyik metódus implementációja felismeri a GUID-t és a parancsot is, akkor a metódusnak az alábbi
prgCmdsjelölőkkel kell beállítania az összes parancs parancsjelző mezőjét (a OLECMDF paraméterben):OLECMDF_SUPPORTED: A parancs támogatott.OLECMDF_INVISIBLE: A parancs nem lehet látható.OLECMDF_LATCHED: A parancs be van kapcsolva, és úgy tűnik, hogy be van jelölve.OLECMDF_ENABLED: A parancs engedélyezve van.OLECMDF_DEFHIDEONCTXTMENU: A parancsnak néha rejtettnek kell lennie, ha megjelenik egy gyorsmenüben.OLECMDF_NINCHED: A parancs egy menüvezérlő, és nincs engedélyezve, de a legördülő menülista nem üres, és továbbra is elérhető. (Ezt a jelzőt ritkán használják.)
Ha a parancsot a .vsct fájlban definiálta a
TextChangesjelölővel, állítsa be a következő paramétereket:Állítsa be a
pCmdTextparaméterrgwzelemét a parancs új szövegére.Állítsa a
pCmdTextparamétercwActualelemét a parancssztring méretére.
Győződjön meg arról is, hogy a jelenlegi környezet nem automatizálási függvény, kivéve, ha a parancs kifejezetten az automatizálási függvények kezelésére szolgál.
Ha azt szeretné jelezni, hogy egy adott parancsot támogat, adja vissza S_OK. Az összes többi parancs esetén adja vissza a következőt: OLECMDERR_E_NOTSUPPORTED.
A következő példában a QueryStatus metódus először meggyőződik arról, hogy a környezet nem automatizálási függvény, majd megkeresi a megfelelő parancskészlet GUID-azonosítóját és parancsazonosítóját. Maga a parancs engedélyezve és támogatva van. Más parancsok nem támogatottak.
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;
}
Végrehajtási módszerek
A metódus implementálása hasonlít a ExecQueryStatus metódus implementálására. Először győződjön meg arról, hogy a környezet nem automatizálási függvény. Ezután tesztelje a GUID-t és a parancsazonosítót is. Ha a GUID vagy a parancsazonosító nem ismerhető fel, adja vissza a következőt OLECMDERR_E_NOTSUPPORTED: .
A parancs kezeléséhez hajtsa végre, és adja vissza S_OK , ha a végrehajtás sikeres. A parancs felelős a hibaészlelésért és az értesítésért; ezért hibakódot ad vissza, ha a végrehajtás sikertelen. Az alábbi példa bemutatja, hogyan kell implementálni a végrehajtási módszert.
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;
}