연습: 목록 하위 메뉴에 추가 하는 가장 최근에 사용
이 연습에서는 데모를 기반으로 연습: 메뉴에 하위 메뉴 추가, 동적 목록 하위 메뉴에 추가 하는 방법을 보여 줍니다. 동적 목록을 가장 최근에 사용한 (MRU) 목록 만들기에 대 한 기초가 됩니다.
자리 표시자는 메뉴와 동적 메뉴 목록을 시작합니다. 메뉴가 표시 됩니다 때마다는 Visual Studio 통합된 개발 환경 (IDE)에서 자리 표시자를 표시 하는 모든 명령에 대해 Vspackage를 묻습니다. 동적 목록 메뉴에서 아무 곳 이나 발생할 수 있습니다. 그러나 동적 목록은 일반적으로 저장 되 고 자체로 하단에 있는 메뉴 또는 하위 메뉴를 표시 합니다. 이러한 디자인 패턴을 사용 하 여 명령 확장 및 다른 명령 메뉴의 위치를 영향을 주지 않고 동적 목록을 사용 하도록 설정 합니다. 이 연습에서는 동적 MRU 목록 하위 메뉴에서 나머지 선으로 구분 하는 기존 하위 메뉴의 맨 아래에 표시 됩니다.
기술적으로 동적 목록 도구 모음에도 적용할 수 있습니다. 그러나 사용자 변경 하려면 특정 단계를 수행 하지 않으면 도구 모음 변경 되지 않은 상태로 유지 되어야 하기 때문에 그 사용을 못하도록 합니다.
이 연습에서는 그 중 하나를 선택할 때마다 순서를 변경할 4 개의 항목은 MRU 목록을 만듭니다 (선택한 항목을 목록의 위쪽으로 이동) 합니다.
메뉴 및.vsct 파일에 대 한 자세한 내용은 명령, 메뉴 및 도구 모음.
이 연습을 완료 하려면 설치 해야 해당 Visual Studio 2010 SDK.
참고
Visual Studio SDK에 대 한 자세한 내용은 참조 하십시오. Visual Studio 개요를 확장합니다..Visual Studio SDK를 다운로드 하는 방법를 참조 하십시오. Visual Studio 확장성 개발자 센터 MSDN 웹 사이트에서.
Visual Studio 패키지 프로젝트 서식 파일에에서 사용할 수 있는 새 프로젝트 대화 상자:
아래에서 Visual Basic 확장성. 프로젝트의 기본 언어는 Visual Basic입니다.
아래에서 C# 확장성. 프로젝트의 기본 언어는 C#입니다.
아래에서 기타 프로젝트 형식 확장. 프로젝트의 기본 언어는 c + +입니다.
- 절차에 따라 연습: 메뉴에 하위 메뉴 추가 다음 절차에서는 수정 된 하위 메뉴를 만들 수 있습니다.
이 연습의 절차는 VSPackage 이름을 가정 TopLevelMenu, 이름에 사용 된 연습: Visual Studio 메뉴 모음 (C#) 메뉴 추가.
Toplevelmenu.vsct를 엽니다.
에 Symbols 섹션에 GuidSymbol guidTopLevelMenuCmdSet, 명명 된 노드 추가에 대 한 기호는 MRUListGroup 그룹 및 cmdidMRUList 명령, 다음과 같은.
에 Groups 섹션에서 선언 된 그룹 뒤에 있는 기존 그룹 항목이 추가 됩니다.
에 있는 Buttons 섹션에서 새로 선언한 명령 후 기존 단추 항목을 나타내는 노드를 추가 합니다.
<Button guid="guidTopLevelMenuCmdSet" id="cmdidMRUList" type="Button" priority="0x0100"> <Parent guid="guidTopLevelMenuCmdSet" id="MRUListGroup" /> <CommandFlag>DynamicItemStart</CommandFlag> <Strings> <CommandName>cmdidMRUList</CommandName> <ButtonText>MRU Placeholder</ButtonText> </Strings> </Button>
DynamicItemStart 플래그를 동적으로 생성 하는 명령을 활성화 합니다.
에 있는 빌드 메뉴에서클릭 솔루션 빌드.
이.vsct 파일의 내용으로 다시 작성 됩니다. 빌드 시 발생할 수 있는 오류를 수정 하십시오.
새 명령으로 표시를 테스트 하려면 F5 키를 누릅니다.
에 TestMenu 메뉴에서 새 하위 메뉴를 클릭 하위 메뉴, 새 명령을 표시 하려면 MRU 자리 표시자. 이 명령은 레이블은 동적 MRU 목록을 명령 다음 절차에서는 구현 된 후 해당 목록에서 하위 메뉴를 열 때마다 대체 됩니다.
참고
실험적인 닫아야 합니다 Visual Studio 다음 섹션을 계속 하기 전에.
PkgCmdID.cs 또는 Pkgcmdid.vb에서 코드 편집기를 엽니다.
기존 명령 Id에 후 다음 명령 ID 추가 PkgCmdIDList 클래스 정의입니다.
public const uint cmdidMRUList = 0x200;
TopLevelMenuPackage.cs 또는 Toplevelmenupackage.vb에서 코드 편집기를 엽니다.
문을 사용 하 여 목록 끝에는 파일의 맨 위에 다음 문을 추가 합니다.
using System.Collections;
찾기는 Initialize 메서드가 있습니다. "패키지 멤버" 라는 숨겨진된 영역을 찾은 다음 확장 할 수 있습니다. Initialize 메서드는이 숨겨진된 영역에 있습니다.
하는 Initialize 메서드를 마지막 호출 바로 뒤에 다음 줄을 추가 AddCommand 메서드. InitMRUMenu 때까지 8 단계 후 정의 되지 것입니다.
this.InitMRUMenu(mcs);
끝에는 MyTopLevelMenuPackage 클래스, 다음 추가 코드 바로 뒤에 SubItemCallback 메서드. 이 코드에서 MRU 목록에 표시할 항목을 나타내는 문자열 목록을 초기화 합니다.
private int numMRUItems = 4; private int baseMRUID = (int)PkgCmdIDList.cmdidMRUList; private ArrayList mruList; private void InitializeMRUList() { if (null == this.mruList) { this.mruList = new ArrayList(); if (null != this.mruList) { for (int i = 0; i < this.numMRUItems; i++) { this.mruList.Add(string.Format(CultureInfo.CurrentCulture, "Item {0}", i + 1)); } } } }
다음은 InitializeMRUList 메서드를 다음 추가 InitMRUMenu 메서드. 그러면 MRU 목록 메뉴 명령을 초기화 됩니다.
private void InitMRUMenu(OleMenuCommandService mcs) { InitializeMRUList(); for (int i = 0; i < this.numMRUItems; i++) { var cmdID = new CommandID( GuidList.guidTopLevelMenuCmdSet, this.baseMRUID + i); var mc = new OleMenuCommand( new EventHandler(OnMRUExec), cmdID); mc.BeforeQueryStatus += new EventHandler(OnMRUQueryStatus); mcs.AddCommand(mc); } }
관리 되는 코드에서 MRU 목록에 모든 가능한 항목에 대 한 메뉴 명령 개체를 만들어야 합니다. IDE 호출을 OnMRUQueryStatus MRU 목록 항목이 더 이상 없을 때까지 각 항목에 대 한 방법. 관리 되는 코드에 항목이 더 이상 알고 있는 IDE 통해서만 가능한 모든 항목을 처음 만드는 것입니다. 원하는 경우 추가 항목이 표시 되지 않도록 때 먼저 사용 하 여 표시할 수 mc.Visible = false; 메뉴 명령 만든. 이러한 항목이 다음 나중에 사용 하 여 표시할 수 있습니다 mc.Visible = true; 에 있는 OnMRUQueryStatus 메서드.
다음은 InitMRUMenu 메서드를 다음 추가 OnMRUQueryStatus 메서드. 각 MRU 항목의 텍스트를 설정 하는 처리기입니다.
private void OnMRUQueryStatus(object sender, EventArgs e) { OleMenuCommand menuCommand = sender as OleMenuCommand; if (null != menuCommand) { int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID; if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count) { menuCommand.Text = this.mruList[MRUItemIndex] as string; } } }
다음은 OnMRUQueryStatus 메서드를 다음 추가 OnMRUExec 메서드. 최근에 사용한 항목 선택에 대 한 처리기입니다. 이 메서드는 선택한 항목을 목록의 위쪽으로 이동 하 고 메시지 상자에 선택한 항목을 표시 합니다.
private void OnMRUExec(object sender, EventArgs e) { var menuCommand = sender as OleMenuCommand; if (null != menuCommand) { int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID; if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count) { string selection = this.mruList[MRUItemIndex] as string; for (int i = MRUItemIndex; i > 0; i--) { this.mruList[i] = this.mruList[i - 1]; } this.mruList[0] = selection; System.Windows.Forms.MessageBox.Show( string.Format(CultureInfo.CurrentCulture, "Selected {0}", selection)); } } }
빌드 메뉴에서 솔루션 빌드를 클릭하여 솔루션을 빌드합니다. 발생할 수 있는 오류를 수정 하십시오.
새 명령으로 표시를 테스트 하려면 F5 키를 누릅니다.
에 있는 TestMenu 메뉴를 클릭 테스트 명령. 이 명령은 선택 된 나타내는 메시지 상자가 표시 됩니다.
참고
이 단계는 VSPackage 로드 하 고 MRU 목록 올바르게 표시를 사용 하도록 필요 합니다.이 단계를 건너뛰면 MRU 목록이 표시 되지 않습니다.
에 있는 테스트 메뉴 메뉴를 클릭 하위 메뉴. 4 개 항목 목록 끝 구분 기호 아래의 하위 메뉴에 표시 됩니다. 클릭 하면 항목 3, 메시지 상자가 표시 되 고 "선택한 항목 3" 텍스트를 표시 합니다. (4 개 항목 목록에 표시 되지 않으면 이전 단계의 지침을에서 따랐는지 확인 합니다.)
하위 메뉴를 다시 엽니다. 알 항목 3 이제 목록의 상단에 있습니다 및 다른 항목은 한 위치 아래로 푸시된. 클릭 항목 3 다시 텍스트 명령 레이블이 함께 새 위치로 제대로 이동 했음을 나타내는 메시지 상자가 여전히 "선택한 항목 3" 표시 됩니다 볼 수 있습니다.