我正在编写一个 VSPackage,我需要有带有复选框的菜单项,就像下面的示例图片所示:
我浏览了this msdn reference关于 .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>
我需要这个额外的复选框。怎么做?
最佳答案
像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;
}
}
关于visual-studio - 如何创建带有复选框的命令菜单项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23033517/