메뉴에 하위 메뉴 추가
이 연습은 TestMenu 메뉴에 하위 메뉴를 추가하는 방법을 보여 줌으로써 Visual Studio 메뉴 모음에 메뉴 추가의 데모를 기반으로 합니다.
하위 메뉴는 다른 메뉴에 표시되는 보조 메뉴입니다. 하위 메뉴는 이름 뒤에 오는 화살표로 식별할 수 있습니다. 이름을 클릭하면 하위 메뉴와 해당 명령이 표시됩니다.
이 연습에서는 Visual Studio 메뉴 모음의 메뉴에 하위 메뉴를 만들고 하위 메뉴에 새 명령을 배치합니다. 또한 연습에서는 새 명령도 구현합니다.
메뉴에 하위 메뉴 추가
Visual Studio 메뉴 모음에 메뉴 추가의 단계에 따라 프로젝트 및 메뉴 항목을 만듭니다. 이 연습의 단계에서는 VSIX 프로젝트의 이름이
TopLevelMenu
라고 가정합니다.Open TestCommandPackage.vsct.
<Symbols>
섹션에서 하위 메뉴의<IDSymbol>
요소, 하위 메뉴 그룹의 요소, 명령의 요소를 모두 “guidTopLevelMenuCmdSet”이라는<GuidSymbol>
노드에 추가합니다. 최상위 메뉴의<IDSymbol>
요소를 포함하는 동일한 노드입니다.<IDSymbol name="SubMenu" value="0x1100"/> <IDSymbol name="SubMenuGroup" value="0x1150"/> <IDSymbol name="cmdidTestSubCommand" value="0x0105"/>
새로 만든 하위 메뉴가
<Menus>
섹션에 추가됩니다.<Menu guid="guidTestCommandPackageCmdSet" id="SubMenu" priority="0x0100" type="Menu"> <Parent guid="guidTestCommandPackageCmdSet" id="MyMenuGroup"/> <Strings> <ButtonText>Sub Menu</ButtonText> <CommandName>Sub Menu</CommandName> </Strings> </Menu>
부모의 GUID/ID 쌍은 Visual Studio 메뉴 모음에 메뉴 추가에서 생성된 메뉴 그룹을 지정하며 최상위 메뉴의 자식입니다.
2단계에서 정의된 메뉴 그룹을
<Groups>
섹션에 추가하고 하위 메뉴의 자식으로 만듭니다.<Group guid="guidTestCommandPackageCmdSet" id="SubMenuGroup" priority="0x0000"> <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/> </Group>
<Buttons>
섹션에 새<Button>
요소를 추가하여 2단계에서 만든 명령을 하위 메뉴의 항목으로 정의합니다.<Button guid="guidTestCommandPackageCmdSet" id="cmdidTestSubCommand" priority="0x0000" type="Button"> <Parent guid="guidTestCommandPackageCmdSet" id="SubMenuGroup" /> <Icon guid="guidImages" id="bmpPic2" /> <Strings> <CommandName>cmdidTestSubCommand</CommandName> <ButtonText>Test Sub Command</ButtonText> </Strings> </Button>
솔루션을 빌드하고 디버깅을 시작합니다. 실험적 인스턴스를 확인합니다.
TestMenu를 클릭하여 하위 메뉴라는 새 하위 메뉴를 확인합니다. 하위 메뉴를 클릭하여 하위 메뉴를 열고 새 명령인 테스트 하위 명령을 확인합니다. 테스트 하위 명령을 클릭해도 아무 작업도 수행되지 않습니다.
명령 추가
TestCommand.cs를 열고 기존 명령 ID 다음에 다음 명령 ID를 추가합니다.
public const int cmdidTestSubCmd = 0x0105;
하위 명령을 추가합니다. 명령 생성자를 찾습니다.
AddCommand
메서드를 호출한 직후에 다음 줄을 추가합니다.CommandID subCommandID = new CommandID(CommandSet, cmdidTestSubCmd); MenuCommand subItem = new MenuCommand(new EventHandler(SubItemCallback), subCommandID); commandService.AddCommand(subItem);
SubItemCallback
명령 처리기는 나중에 정의됩니다. 생성자는 이제 다음과 같이 표시됩니다.private TestCommand(Package package) { if (package == null) { throw new ArgumentNullException("package"); } this.package = package; OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; if (commandService != null) { var menuCommandID = new CommandID(CommandSet, CommandId); var menuItem = new MenuCommand(this.MenuItemCallback, menuCommandID); commandService.AddCommand(menuItem); CommandID subCommandID = new CommandID(CommandSet, cmdidTestSubCmd); MenuCommand subItem = new MenuCommand(new EventHandler(SubItemCallback), subCommandID); commandService.AddCommand(subItem); } }
SubItemCallback()
를 추가합니다. 하위 메뉴의 새 명령을 클릭할 때 호출되는 메서드입니다.private void SubItemCallback(object sender, EventArgs e) { ThreadHelper.ThrowIfNotOnUIThread(); IVsUIShell uiShell = this.package.GetService<SVsUIShell, IVsUIShell>(); Guid clsid = Guid.Empty; int result; uiShell.ShowMessageBox( 0, ref clsid, "TestCommand", string.Format(CultureInfo.CurrentCulture, "Inside TestCommand.SubItemCallback()", this.ToString()), string.Empty, 0, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO, 0, out result); }
프로젝트를 빌드하고 디버깅을 시작합니다. 실험적 인스턴스가 나타납니다.
TestMenu 메뉴에서 하위 메뉴를 클릭한 다음, 하위 명령 테스트를 클릭합니다. 메시지 상자가 표시되고 “Test Command Inside TestCommand.SubItemCallback()”이라는 텍스트가 표시되어야 합니다.