Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何使用复选框创建命令菜单项?_Visual Studio_Visual Studio Extensions_Vsix_Vspackage_Vsct - Fatal编程技术网

Visual studio 如何使用复选框创建命令菜单项?

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实例的创建

我正在编写一个VSPackage,我需要有一个带有复选框的菜单项,就像下面这个示例图像一样:

我查看了有关.vsct文件的内容,bud没有提供任何解释如何操作的信息。我现在拥有的是带有图标和文本的标准菜单项(MyPackage.vsct文件中的代码示例):


文本更改
唐奇
固定控制器
我的包裹

我需要这个额外的复选框。如何操作?

无法通过
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;
    }
}