방법: 동적으로 메뉴 항목을 추가 합니다.
명령을 명령 테이블 구성 XML-Based (.vsct) 파일에 정의 되어 있는 DynamicItemStart 플래그 동적으로 만들어진된 명령을 삽입 메뉴에서 위치를 지정 합니다. 동적 명령 관련된 VSPackage 시작 되 고 있는 VSPackage 열려 있을 때 업데이트할 수 있습니다 때 일반적으로 만들어집니다.
두 가지 일반적인 동적 목록은 다음과 같습니다.
일반적으로 최근에 연 문서 이름을 표시 하는 대부분의 MRU (최근에 사용한) 목록입니다.
일반적으로 현재 있는 창 이름을 표시 하는 창 목록을 엽니다.
DynamicItemStart 명령 정의 플래그 지정 명령에는 자리 표시자입니다 있는 Vspackage를 열어야 합니다. 있는 Vspackage를 열 때 개체 틀 이며 Vspackage로 런타임에 만든 동적 목록에 추가할 추가 명령 또는 0 대체 됩니다. 있는 VSPackage 열릴 때까지 동적 목록이 나타나는 위치 메뉴에서 위치를 볼 수 있습니다.
동적 목록을 채우려면 통합된 개발 환경 (IDE) 먼저 그 첫 번째 문자가 자리 표시자의 ID와 동일 ID 명령을 찾으려면 Vspackage를 호출 합니다. 일치 하는 명령이 IDE 발견 되 면 명령의 이름을 동적 목록에 추가 합니다. 다음 IDE ID를 증가 시키는 및 동적 목록에 추가 하는 다른 일치 하는 명령을 찾습니다. IDE ID를 증가 하 고 더 이상 동적 명령 때까지 동적 목록에 추가 됩니다.
첫 번째 절차에서는 동적 MRU 목록에서 하위 메뉴를 만드는 방법을 설명 합니다.
두 번째 절차 관리 패키지 프레임 워크 (MPF)를 사용 하 여 동적 목록을 채우는 방법에 설명 합니다.
.Vsct 파일에 대 한 자세한 내용은 Visual Studio 명령은 테이블 (.Vsct) 파일.
MRU 목록을 만드는 방법에 대 한 자세한 내용은 연습: 목록 하위 메뉴에 추가 하는 가장 최근에 사용.
동적 명령 목록 만들기
동적 명령 목록을 만들려면 먼저 추가 해야 합니다는 단추 .vsct 파일의 요소입니다. 이 요소의 IDE에서 목록에 대 한 개체 틀이 됩니다. 다음의 목록에서 코드를 구현 합니다.
동적 명령 목록에 대 한 자리 표시자를 만들려면
.Vsct 파일에 명령 그룹을 포함 하는 하위 메뉴를 만듭니다. 자세한 내용은 방법: 메뉴, 하위 메뉴, 바로 가기 메뉴 만들기를 참조하십시오.
이 하위 메뉴의 동적 목록이 포함 됩니다.
에 Symbols 섹션의.vsct 파일을 찾은 GuidSymbol 다른 명령을 포함 하는 요소입니다. 추가 IDSymbol 요소에 대 한의 MRUListGroup 그룹 및 cmdidMRUList 동적 목록 자리 표시자를 다음과 같은 명령을 합니다.
그룹에는 다음과 같이 정의 합니다.
<Group guid="guidTopLevelMenuCmdSet" id="MRUListGroup" priority="0x100"> <Parent guid="guidTopLevelMenuCmdSet" id="SubMenu"/> </Group>
새 명령으로 정의 된 Button 요소에는 Buttons 섹션.
설정에서 guid 및 id 필드에 새 요소를 나타내는 GUID:ID 쌍입니다. GUID:ID 쌍으로 구성 됩니다의 name 의 값은 GuidSymbol 및 IDSymbol 이전 단계의 요소.
이 GUID:ID 쌍 Vspackage가 런타임에 추가 되는 동적 명령 목록에서 첫 번째입니다. 각 후속 동적 명령 ID 하나 이전 동적 명령 ID 보다 큰 있습니다.
설정에서 type 특성에 단추.
동적 명령 단추와 같은 다른 명령 형식에 없습니다.
설정 하지 않은 한 priority 명령에 대 한 특성.
이 하위 메뉴는 하나의 동적 목록을 포함합니다. 따라서 첫 번째 항목의 우선 순위는 중요 하지 않습니다. 나중에 추가 된 항목이 동적 우선 순위가 있습니다. 상대 위치를 각각 추가 되는 순서를 결정 합니다.
추가 부모 요소 guid 및 id 하위 메뉴에 만든 그룹의 이름과 일치 하는 특성입니다.
추가 된 명령 플래그 요소 값을 설정 고 DynamicItemStart.
이 명령의 자리 표시자로 표시 됩니다.
참고
다른 플래그를 모두 무시 됩니다.동적 항목의 표시 여부를 제어 하려면 Vspackage를 실행된 시간에 이렇게 해야 합니다.
추가 문자열 포함 하는 요소는 를 로드 합니다 요소 a CommandName 요소 및 자리 표시자의 이름으로 해당 값을 설정 합니다.
일반적으로이 단추 텍스트가 포함 된 메뉴를 표시 하기 전에 동적 목록 Vspackage를 초기화할 수 있습니다 경우 표시 되지 않습니다.
지정 하지 않은 아이콘 요소입니다.
동적 명령에 연결 된 아이콘을 사용할 수 없습니다.
다음 예제에서는 완료 된 명령 정의 MRU 목록 자리 표시자를 보여 줍니다.
<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>
동적 목록 구현
관리 패키지 프레임 워크 (MPF) 이벤트 처리기를 사용 하 여 세부 정보를 숨길 수 있는 IOleCommandTarget 인터페이스 및 해당 QueryStatus 메서드. MPF를 사용 하 여 동적 메뉴 명령 목록을 지원 하도록 작성 된 Vspackage를 목록 만들기 OleMenuCommand 각각의 동적 목록에 있는 항목을 나타내는 개체입니다. 모든 OleMenuCommand 개체 실행 하는 명령 및 명령 상태를 가져오기 위한 동일한 이벤트 처리기를 동일한 이벤트 처리기가 있습니다.
참고
코드에서 다음 절차를 사용 하 여 연습: 목록 하위 메뉴에 추가 하는 가장 최근에 사용 동적 목록을 구현 하는 방법에 설명 합니다.그러나 코드 완료 Vspackage를 만들지 않습니다.전체 샘플은 연습을 참조 하십시오.
동적 목록 구현
ID를 Pkgcmdid.cs에서 Id의 목록에 추가 합니다.
public const uint cmdidMRUList = 0x200;
Toplevelmenupackage.cs에서이 문을 사용 하 여 추가 합니다.
using System.Collections;
자리 표시자에 바인딩하는 OleMenuCommand 이벤트 처리기를 할당 합니다. 다음 예제에서는 메서드 호출의 Initialize() 메서드는 패키지에 있습니다.
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); } }
이 절차의 예제는 다음과 같은 private 변수를 사용 한다고 가정 합니다.
private int numMRUItems = 4; private int baseMRUID = (int)PkgCmdIDList.cmdidMRUList; private ArrayList mruList;
다음 예제에서와 같이 동적 목록을 채우는 QueryStatus 이벤트 처리기를 사용 합니다.
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; } } }
목록에서 항목을 클릭할 때 응답 하는 Exec 처리기를 구현 합니다. 다음은 가장 최근의 맨 위에 표시 되는 목록 항목의 위치를 업데이트 합니다.
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)); } } }
사용 해도 Text 속성 또는 CommandID 속성에서 선택 된 항목을 식별 하 고 그에 따라 응답 합니다.
메뉴 또는 메뉴 항목의 표시 유형을 설정 하 여 제어의 Visible 속성입니다. 다음 코드는 메뉴 또는 메뉴 항목 보이지 않게 됩니다.
var menuCommand = sender as OleMenuCommand; menuCommand.Visible = false;
QueryStatus 처리기에서 앞의 코드를 넣으면 적용이 전체 메뉴를 제공 하기 때문에 sender 인수를 해당 처리기입니다. 그러나 Exec 처리기에 넣으면 실행 되 고 있는 개별 메뉴 항목을만 영향을 줍니다.
참고 항목
개념
Vspackages에 IDE 사용자 인터페이스 요소를 추가 하는 방법