Как создать пункт меню команд с флажком?
Я пишу 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;
}
}