Visual studio 如何使用复选框创建命令菜单项?
我正在编写一个VSPackage,我需要有一个带有复选框的菜单项,就像下面这个示例图像一样: 我查看了有关.vsct文件的内容,bud没有提供任何解释如何操作的信息。我现在拥有的是带有图标和文本的标准菜单项(MyPackage.vsct文件中的代码示例):Visual studio 如何使用复选框创建命令菜单项?,visual-studio,visual-studio-extensions,vsix,vspackage,vsct,Visual Studio,Visual Studio Extensions,Vsix,Vspackage,Vsct,我正在编写一个VSPackage,我需要有一个带有复选框的菜单项,就像下面这个示例图像一样: 我查看了有关.vsct文件的内容,bud没有提供任何解释如何操作的信息。我现在拥有的是带有图标和文本的标准菜单项(MyPackage.vsct文件中的代码示例): 文本更改 唐奇 固定控制器 我的包裹 我需要这个额外的复选框。如何操作?无法通过VSCT文件定义选中的、可见的、启用的或支持的等属性。您需要一个控制命令状态的命令处理程序。我创建了一个基类,它包装了OleMenuCommand实例的创建
文本更改
唐奇
固定控制器
我的包裹
我需要这个额外的复选框。如何操作?无法通过
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;
}
}
你好我没有注意到这些属性是由OleMenuCommand
公开的。谢谢但是,这个复选框看起来与我问题中屏幕截图上显示的复选框不同。也许这些来自屏幕截图的只是单独的菜单项,由它们的可见性状态切换。。。()? 第二个区别是,当我点击这个项目时,它会关闭(消失,这通常是正确的行为)。你知道如何在点击时保持它一直打开(在顶部)吗;我想说的是,复选框看起来确实和截图中的一样;不幸的是,我不知道如何防止菜单在点击某个项目时关闭。
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;
}
}