2

가 나는 VSPackage을 쓰고 있어요 난 그냥 아래에이 샘플 이미지와 같이 체크 박스 메뉴 항목이 필요합니다 : 나는 .vsct 파일에 대한 this msdn reference 통해 갔다체크 박스가있는 명령 메뉴 항목을 만드는 방법은 무엇입니까?

enter image description here

, 꽃 봉오리하지 않았다 어떻게하는지 설명하는 모든 정보를 잘 작성하십시오. 나는이 추가 확인란을 필요

<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> 

: 내가 지금 가지고있는 것은 (MyPackage.vsct 파일의 코드 샘플) 아이콘과 텍스트 표준 메뉴 항목입니다. 그것을하는 방법? Checked, Visible, Enabled 또는 Supported

답변

3

특성은 VSCT 파일을 통해 정의 할수 없어. 명령의 상태를 제어하는 ​​명령 처리기가 필요합니다. 나는 OleMenuCommand 인스턴스의 생성을 래핑하고 명령의 BeforeQueryStatus 이벤트를 처리하는 기본 클래스를 만들었습니다. 이것은 내 구현의 몸매는 여전 버전입니다,하지만 그것을 해결하는 방법을 생각 ... CommandHandler 클래스는 모든 메뉴 명령의 상태를 제어 할 수 있습니다

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; } 
} 

당신에게 제공 할 것입니다. 그냥 ...

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

안녕을 그것에서 새로운 핸들러 구현을 유도하고 OnExecuteOnQueryStatus 방법 등이 우선합니다. 나는 OleMenuCommand에 의해 노출 된 이러한 속성을 알지 못했습니다. 감사. 하지만 여전히이 체크 박스는 내 질문에 스크린 샷에 표시된 것과는 다르게 보입니다. 어쩌면 이들 스크린 샷의 메뉴 항목은 각각의 가시성 상태로 토글 된 별도의 메뉴 항목 일 것입니다. ([여기에 표시되는 것과 같이] (http://dotneteers.net/blogs/divedeeper/archive/2010/05/23/vs-2010-package- development-chapter-2-commands-menus-and-toolbars.aspx))? 그리고 두 번째 차이점 - 항목을 클릭하면 닫힙니다 (일반적으로 올바른 동작입니다). 클릭하는 동안 끊임없이 열어 두는 법을 알고 있습니까? – jwaliszko

+0

흠; 확인란은 스크린 샷과 동일하게 보입니다. 불행히도 항목을 클릭 할 때 메뉴가 닫히지 않도록하는 방법을 모르겠습니다. – Matze