2

Я пишу VSPackage и мне нужно иметь пункт меню с флажком, так же, как на этом примере изображения ниже:Как создать пункт меню команды с помощью флажка?

enter image description here

Я прошел через this msdn reference о .vsct файлов, почка не прекратите любую информацию, объясняющую, как это сделать. То, что я сейчас стандартный пункт меню с иконкой и текстом (пример кода из файла 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> 

мне нужен этот дополнительный флажок. Как это сделать?

ответ

3

свойство, как 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; 
    } 
} 
+0

Привет. Я не заметил этих свойств, открытых «OleMenuCommand». Благодарю. Но все же этот флажок выглядит иначе, чем этот, представленный на скриншоте в моем вопросе. Возможно, это скриншот - это просто отдельные пункты меню, переключенные по их состоянию видимости ... ([как показано здесь] (http://dotneteers.net/blogs/divedeeper/archive/2010/05/23/vs-2010-package- разработка-глава-2-команд-меню-и-toolbars.aspx))? И второе различие - когда я нажимаю на элемент, он закрывается (исчезает, что обычно является правильным поведением). Знаете ли вы, как держать его постоянно открытым (сверху) во время клика? – jwaliszko

+0

Хм; Я бы сказал, что флажки выглядят так же, как на скриншоте; К сожалению, я не знаю, как предотвратить закрытие меню при нажатии элемента. – Matze

 Смежные вопросы

  • Нет связанных вопросов^_^