Как включить / отключить команду в проекте Visual Studio 2017 VSIX C#

Я разрабатываю расширение для Visual Studio 2017 с использованием проекта C# VSIX. Мне нужно создать переменное количество команд на основе настроек в INI-файле. Я думал создать максимальное количество команд (потому что в проекте VSIX каждая команда нуждается в новом файле.cs) и включить только команды, записанные в файле.ini. К сожалению, я не знаю, как отключить команду. Мне нужно включить команды, когда логическое становится истиной.

Я видел, что мне нужно использовать класс OleMenuCommand, но у меня нет методов Initialize() и StatusQuery(). Как я могу динамически включить мои команды?

2 ответа

Решение

Когда вы создаете OleMenuCommand для добавления с помощью OleMenuCommandService, вы можете подписаться на событие BeforeQueryStatus и внутри него динамически включать / отключать команду:

    private void OnQueryStatus(object sender)
    {
            Microsoft.VisualStudio.Shell.OleMenuCommand menuCommand =
                sender as Microsoft.VisualStudio.Shell.OleMenuCommand;
            if (menuCommand != null)
                menuCommand.Visible = menuCommand.Enabled = MyCommandStatus();
    }

Чтобы включить / отключить команды в Visual Studio, вы можете подписаться на BeforeQueryStatus событие вашего OleMenuCommand:

myOleMenuCommand.BeforeQueryStatus += QueryCommandHandler;

private void QueryCommandHandler(object sender)
{
        var menuCommand = sender as Microsoft.VisualStudio.Shell.OleMenuCommand;
        if (menuCommand != null)
            menuCommand.Visible = menuCommand.Enabled = MyCommandStatus();
}

Возможная реализация MyCommandStatus() Метод может быть:

public bool MyCommandStatus()
{
    // do this if you want to disable your commands when the solution is not loaded
    if (false == mDte.Solution.IsOpen)
      return false;

    // do this if you want to disable your commands when the Visual Studio build is running
    else if (true == VsBuildRunning)
      return false;

    // Write any condition here

    return true;

}
Другие вопросы по тегам