Implementace příkazu

Chcete-li implementovat příkaz v balíčky VSPackage, je nutné provést následující úlohy:

  1. V souboru .vsct nastavte skupinu příkazů a pak do ní přidejte příkaz . Další informace najdete v Visual Studio tabulky příkazů (.vsct).

  2. Zaregistrujte příkaz v Visual Studio.

  3. Implementujte příkaz .

Následující části vysvětlují, jak registrovat a implementovat příkazy.

Registrace příkazů pomocí Visual Studio

Pokud se příkaz má zobrazit v nabídce, musíte do balíčku VSPackage přidat a použít jako hodnotu název nabídky nebo jeho ProvideMenuResourceAttribute ID prostředku.

[ProvideMenuResource("Menus.ctmenu", 1)]
...
    public sealed class MyPackage : Package
    {.. ..}

Kromě toho musíte příkaz zaregistrovat pomocí OleMenuCommandService . Tuto službu můžete získat pomocí metody GetService , pokud je váš balíček VSPackage odvozen z Package .

OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if ( null != mcs )
{
    // Create the command for the menu item.
    CommandID menuCommandID = new CommandID(guidCommandGroup, myCommandID);
    MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID );
    mcs.AddCommand( menuItem );
}

Implementace příkazů

Příkazy můžete implementovat několika způsoby. Pokud chcete příkaz statické nabídky, což je příkaz, který se vždy zobrazuje stejným způsobem a ve stejné nabídce, vytvořte příkaz pomocí příkazu , jak je znázorněno v příkladech MenuCommand v předchozí části. Pokud chcete vytvořit statický příkaz, musíte zadat obslužnou rutinu události, která je zodpovědná za provedení příkazu. Vzhledem k tomu, že příkaz je vždycky povolený a viditelný, není nutné zakazovat jeho stav pro Visual Studio. Pokud chcete změnit stav příkazu v závislosti na určitých podmínkách, můžete vytvořit příkaz jako instanci třídy a v jeho konstruktoru zadat obslužnou rutinu události ke spuštění příkazu a obslužné rutiny, která upozorní Visual Studio při změně stavu OleMenuCommand QueryStatus příkazu. Můžete také implementovat jako součást třídy příkazů, nebo můžete implementovat, pokud zadáte příkaz IOleCommandTarget IVsHierarchy jako součást projektu. Obě rozhraní a třída mají metody, které Visual Studio o změně stavu příkazu, a další metody, které poskytují OleMenuCommand provádění příkazu.

Když se příkaz přidá do příkazové služby, stane se jedním z řetězců příkazů. Při implementaci oznámení stavu a metod provádění pro příkaz je třeba poskytnout pouze tento konkrétní příkaz a předat všechny ostatní případy ostatním příkazům v řetězci. Pokud se vám nepodaří předat příkaz (obvykle OLECMDERR_E_NOTSUPPORTED vrácením ), Visual Studio nemusí správně fungovat.

Metody QueryStatus

Pokud provádíte implementaci metody nebo , zkontrolujte identifikátor GUID sady příkazů, ke které příkaz patří, a QueryStatus QueryStatusCommand ID příkazu. Postupujte podle těchto pokynů:

  • Pokud identifikátor GUID není rozpoznán, vaše implementace jedné z metod musí vrátit OLECMDERR_E_UNKNOWNGROUP .

  • Pokud implementace některé z metod rozpozná identifikátor GUID, ale ne implementuje příkaz , měla by metoda vrátit OLECMDERR_E_NOTSUPPORTED .

  • Pokud implementace jedné z metod rozpozná identifikátor GUID i příkaz , měla by metoda nastavit pole command-flags každého příkazu (v parametru ) pomocí prgCmds následujících OLECMDF příznaků:

    • OLECMDF_SUPPORTED: Příkaz je podporovaný.

    • OLECMDF_INVISIBLE: Příkaz by neměl být viditelný.

    • OLECMDF_LATCHED: Příkaz je zapnout a zdá se, že byl zaškrtnut.

    • OLECMDF_ENABLED: Příkaz je povolený.

    • OLECMDF_DEFHIDEONCTXTMENU: Příkaz by měl být skrytý, pokud se zobrazí v místní nabídce.

    • OLECMDF_NINCHED: Příkaz je kontroler nabídek a není povolený, ale jeho rozevírací seznam není prázdný a je stále k dispozici. (Tento příznak se používá zřídka.)

  • Pokud byl příkaz definován v souboru .vsct s TextChanges příznakem , nastavte následující parametry:

    • Nastavte rgwz element pCmdText parametru na nový text příkazu.

    • Nastavte cwActual element pCmdText parametru na velikost řetězce příkazu.

Ujistěte se také, že aktuální kontext není funkcí automatizace, pokud není váš příkaz speciálně určen ke zpracování automatizačních funkcí.

Pokud chcete označit, že podporujete konkrétní příkaz, vraťte S_OK . Pro všechny ostatní příkazy vraťte OLECMDERR_E_NOTSUPPORTED .

V následujícím příkladu metoda nejprve zajistí, aby kontext nebyl funkcí automatizace, a pak najde správný QueryStatus identifikátor GUID sady příkazů a ID příkazu. Samotný příkaz je nastavený tak, aby byl povolený a podporovaný. Nejsou podporovány žádné další příkazy.

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 spuštění

Implementace metody Exec se podobá implementaci QueryStatus metody . Nejprve se ujistěte, že kontext není funkcí automatizace. Pak otestujte identifikátor GUID i ID příkazu. Pokud identifikátor GUID nebo ID příkazu nerozpoznáte, vraťte OLECMDERR_E_NOTSUPPORTED .

Pokud chcete příkaz zpracovat, spusťte ho a v případě úspěšného provedení S_OK ho vraťte. Váš příkaz zodpovídá za detekci chyb a oznámení. Proto v případě selhání provádění vraťte kód chyby. Následující příklad ukazuje, jak by měla být implementována metoda provádění.

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) uint)VSConstants.VSStd2KCmdID.RIGHT)
            {
                //execute the command
                return VSConstants.S_OK;
            }
        }
    }
    return Constants.OLECMDERR_E_NOTSUPPORTED;
}

Viz také