Как создать пункт меню команд с флажком?

Я пишу VSPackage, и мне нужно иметь пункт меню с флажком, как на этом образце ниже:

Я просмотрел эту ссылку msdn, касающуюся файлов .vsct, но bud не обнаружил никакой информации, объясняющей, как это сделать. Теперь у меня есть стандартный пункт меню со значком и текстом (пример кода из файла MyPackage.vsct):

<Buttons>     
  <Button guid="guidMyPackageCmdSet" id="cmdidMyPackage" type="Button">
    <Icon guid="guidImages" id="myPackageBitmap" />
    <CommandFlag>TextChanges</CommandFlag>
    <CommandFlag>DontCache</CommandFlag>
    <CommandFlag>FixMenuController</CommandFlag>
    <Strings>
      <ButtonText>MyPackage</ButtonText>
    </Strings>
  </Button>      
</Buttons>

Мне нужен этот дополнительный флажок. Как это сделать?

1 ответ

Свойства как Checked, Visible, Enabled или же Supported не может быть определена через VSCT файл. Вам нужен обработчик команды, который контролирует состояние команды. Я создал базовый класс, который оборачивает создание OleMenuCommand экземпляр и обрабатывает команды BeforeQueryStatus событие. Это уменьшенная версия моей реализации, но она даст вам представление, как ее решить...

internal abstract class CommandHandler : IDisposable
{
    private readonly OleMenuCommand command;

    protected CommandHandler(Guid group, int id)
    {
        var commandid = CommandID(group, id);
        this.command = new OleMenuCommand(this.Invoke, commandId);
        this.command.BeforeQueryStatus += this.OnBeforeQueryStatus;
    }

    protected virtual void OnExecute() { } 

    protected virtual void OnQueryStatus(QueryStatusEventArgs e) { }

    private void Invoke(object sender, EventArgs e)
    {
        this.OnExecute();
    }

    private void OnBeforeQueryStatus(object sender, EventArgs e)
    {
        OleMenuCommand command;
        if ((command = sender as OleMenuCommand) != null)
        {
            var e = new QueryCommandEventArgs
            {
                Checked = command.Checked,
            }

            this.OnQueryStatus(e);

            command.Checked = e.Checked;
        }
    }

    public void Dispose()
    {
        this.command.BeforeQueryStatus -= this.OnBeforeQueryStatus;
    }
}

public class QueryCommandEventArgs : EventArgs
{
    public bool Checked { get; set; }
}

CommandHandler Класс позволяет контролировать состояние любой команды меню. Просто извлеките из него новые реализации обработчика и переопределите OnExecute а также OnQueryStatus методы, как...

internal sealed class MyCommand : CommandHandler
{
    private bool checked;

    public MyCommand() : base(GuidCmdSet, MyCommandId) { }

    protected override void OnExecute()
    {
        this.checked = !this.checked; // toggle checked state
    }

    protected override void OnQueryStatus(QueryStatusEventArgs e)
    {
        e.Checked = this.checked;
    }
}
Другие вопросы по тегам