다음을 통해 공유


메뉴 명령의 텍스트 변경

다음 단계에서는 IMenuCommandService 서비스를 사용하여 메뉴 명령의 텍스트 레이블을 변경하는 방법을 보여줍니다.

IMenuCommandService를 사용하여 메뉴 명령 레이블 변경

  1. ChangeMenuText라는 메뉴 명령을 사용하여 MenuText이라는 VSIX 프로젝트를 만듭니다. 자세한 내용은 메뉴 명령으로 확장 만들기를 참조하세요.

  2. 다음 예제와 같이 .vsct 파일에서 메뉴 명령에 TextChanges 플래그를 추가합니다.

    <Button guid="guidChangeMenuTextPackageCmdSet" id="ChangeMenuTextId" priority="0x0100" type="Button">
        <Parent guid="guidChangeMenuTextPackageCmdSet" id="MyMenuGroup" />
        <Icon guid="guidImages" id="bmpPic1" />
        <CommandFlag>TextChanges</CommandFlag>
        <Strings>
            <ButtonText>Invoke ChangeMenuText</ButtonText>
        </Strings>
    </Button>
    
  3. ChangeMenuText.cs 파일에서 메뉴 명령이 표시되기 전에 호출될 이벤트 처리기를 만듭니다.

    private void OnBeforeQueryStatus(object sender, EventArgs e)
    {
        var myCommand = sender as OleMenuCommand;
        if (null != myCommand)
        {
            myCommand.Text = "New Text";
        }
    }
    

    OleMenuCommand 개체의 Visible 속성, Checked 속성, Enabled 속성을 변경하여 이 메서드의 메뉴 명령 상태를 업데이트할 수도 있습니다.

  4. ChangeMenuText 생성자에서 원래 명령 초기화 및 배치 코드를 메뉴 명령을 나타내는 (MenuCommand 대신) OleMenuCommand)를 만들고, BeforeQueryStatus 이벤트 처리기를 추가하고, 메뉴 명령을 메뉴 명령 서비스에 제공하는 코드로 바꿉니다.

    그 형태는 다음과 같습니다.

    private ChangeMenuText(AsyncPackage package, OleMenuCommandService commandService)
    {
        this.package = package ?? throw new ArgumentNullException(nameof(package));
        commandService = commandService ?? throw new ArgumentNullException(nameof(commandService));
    
        var menuCommandID = new CommandID(CommandSet, CommandId);
        var menuItem = new OleMenuCommand(this.Execute, menuCommandID);
        menuItem.BeforeQueryStatus += new EventHandler(OnBeforeQueryStatus);
        commandService.AddCommand(menuItem);
    }
    
  5. 프로젝트를 빌드하고 디버깅을 시작합니다. Visual Studio의 실험적 인스턴스가 시작됩니다.

  6. 도구 메뉴에 ChangeMenuText 호출이라는 명령이 표시되어야 합니다.

  7. 명령을 클릭합니다. MenuItemCallback이 호출되었음을 알리는 메시지 상자가 표시됩니다. 메시지 상자를 해제하면 도구 메뉴의 명령 이름이 이제 새 텍스트임을 알 수 있습니다.