visual-studio - 如何创建带有复选框的命令菜单项?

标签 visual-studio visual-studio-extensions vsix vspackage vsct

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

enter image description here

我浏览了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 , EnabledSupported无法通过 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类允许控制任何菜单命令的状态。只需从中派生新的处理程序实现并覆盖 OnExecuteOnQueryStatus方法,例如...

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/

相关文章:

c# - 我的 asp.net 核心项目中没有 .csproj 文件

c# - mysql 服务器与 Visual Studio 2010 .net 集成

visual-studio - Visual Studio 可以(它应该能够)计算与工作项关联的任意两个变更集之间的差异吗?

visual-studio-2010 - 如何创建运行 VSIX 方法的快捷方式?

c# - 以 .NET Standard 为目标并使用新的 csproj 格式的 VSIX flavor 项目

visual-studio - 如何判断事件文档是否为文本文档?

C编程递归

c# - 在 ITextViewLine 上运行正则表达式(Visual Studio 扩展)

sql-server - 如何为 SSMS 2019 (v18) 创建扩展

c# - 每个 UI 上下文的 Visual Studio 可扩展性 : ProvideAutoLoad for Package. cs