다음을 통해 공유


하위 메뉴에 가장 최근에 사용한 목록 추가

이 연습은 메뉴에 하위 메뉴 추가의 데모를 기반으로 하며 하위 메뉴에 동적 목록을 추가하는 방법을 보여 줍니다. 동적 목록은 MRU(가장 최근에 사용한) 목록을 만들기 위한 기초를 형성합니다.

동적 메뉴 목록은 메뉴의 자리 표시자로 시작합니다. 메뉴가 표시될 때마다 Visual Studio IDE(통합 개발 환경)는 자리 표시자에 표시되어야 하는 모든 명령에 대해 VSPackage에 요청합니다. 동적 목록은 메뉴의 어디에서나 발생할 수 있습니다. 그러나 동적 목록은 일반적으로 하위 메뉴 또는 메뉴 아래쪽에 자체적으로 저장되고 표시됩니다. 이러한 디자인 패턴을 사용하면 메뉴의 다른 명령 위치에 영향을 주지 않고 동적 명령 목록을 확장 및 축소할 수 있습니다. 이 연습에서는 동적 MRU 목록이 기존 하위 메뉴의 맨 아래에 표시되고 나머지 하위 메뉴와 줄로 구분됩니다.

기술적으로 동적 목록을 도구 모음에 적용할 수도 있습니다. 그러나 사용자가 변경하기 위한 특정 단계를 수행하지 않는 한 도구 모음은 변경되지 않은 상태로 유지되어야 하므로 사용이 권장되지 않습니다.

이 연습에서는 선택한 항목 중 하나가 선택될 때마다 순서를 변경하는 4개 항목의 MRU 목록을 만듭니다(선택한 항목이 목록의 맨 위로 이동).

메뉴 및 .vsct 파일에 대한 자세한 내용은 명령, 메뉴, 도구 모음을 참조하세요.

필수 조건

이 연습을 수행하려면 Visual Studio SDK를 설치해야 합니다. 자세한 내용은 Visual Studio SDK를 참조하세요.

확장 만들기

동적 항목 목록 만들기 명령

  1. Open TestCommandPackage.vsct.

  2. Symbols 섹션의 guidTestCommandPackageCmdSet이라는 GuidSymbol 노드에서 다음과 같이 MRUListGroup 그룹 및 cmdidMRUList 명령에 대한 기호를 추가합니다.

    <IDSymbol name="MRUListGroup" value="0x1200"/>
    <IDSymbol name="cmdidMRUList" value="0x0200"/>
    
  3. Groups 섹션에서 기존 그룹 항목 뒤에 선언된 그룹을 추가합니다.

    <Group guid="guidTestCommandPackageCmdSet" id="MRUListGroup"
            priority="0x0100">
        <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/>
    </Group>
    
  4. Buttons 섹션에서 기존 단추 항목 뒤에 새로 선언된 명령을 나타내는 노드를 추가합니다.

    <Button guid="guidTestCommandPackageCmdSet" id="cmdidMRUList"
        type="Button" priority="0x0100">
        <Parent guid="guidTestCommandPackageCmdSet" id="MRUListGroup" />
        <CommandFlag>DynamicItemStart</CommandFlag>
        <Strings>
            <CommandName>cmdidMRUList</CommandName>
            <ButtonText>MRU Placeholder</ButtonText>
        </Strings>
    </Button>
    

    DynamicItemStart 플래그를 사용하면 명령을 동적으로 생성할 수 있습니다.

  5. 프로젝트를 빌드하고 디버깅을 시작하여 새 명령의 표시를 테스트합니다.

    TestMenu 메뉴에서 새 하위 메뉴인 Sub Menu를 클릭하여 새 명령인 MRU Placeholder를 표시합니다. 다음 절차에서 동적 MRU 명령 목록이 구현된 후 이 명령 레이블은 하위 메뉴가 열릴 때마다 해당 목록으로 바뀝니다.

MRU 목록 채우기

  1. TestCommandPackageGuids.cs에서 클래스 정의의 기존 명령 ID 다음에 다음 줄을 추가합니다TestCommandPackageGuids.

    public const string guidTestCommandPackageCmdSet = "00000000-0000-0000-0000-00000000"; // get the GUID from the .vsct file
    public const uint cmdidMRUList = 0x200;
    
  2. TestCommand.cs에서 다음 using 문을 추가합니다.

    using System.Collections;
    
  3. 마지막 AddCommand 호출 후 TestCommand 생성자에 다음 코드를 추가합니다. InitMRUMenu는 나중에 정의됩니다.

    this.InitMRUMenu(commandService);
    
  4. TestCommand 클래스에 다음 코드를 추가합니다. 이 코드는 MRU 목록에 표시할 항목을 나타내는 문자열 목록을 초기화합니다.

    private int numMRUItems = 4;
    private int baseMRUID = (int)TestCommandPackageGuids.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));
                }
            }
        }
    }
    
  5. InitializeMRUList 메서드 뒤에 InitMRUMenu 메서드를 추가합니다. 그러면 MRU 목록 메뉴 명령이 초기화됩니다.

    private void InitMRUMenu(OleMenuCommandService mcs)
    {
        InitializeMRUList();
        for (int i = 0; i < this.numMRUItems; i++)
        {
            var cmdID = new CommandID(
                new Guid(TestCommandPackageGuids.guidTestCommandPackageCmdSet), this.baseMRUID + i);
            var mc = new OleMenuCommand(
                new EventHandler(OnMRUExec), cmdID);
            mc.BeforeQueryStatus += new EventHandler(OnMRUQueryStatus);
            mcs.AddCommand(mc);
        }
    }
    

    MRU 목록의 가능한 모든 항목에 대한 메뉴 명령 개체를 만들어야 합니다. IDE는 더 이상 항목이 없을 때까지 MRU 목록의 각 항목에 대해 OnMRUQueryStatus 메서드를 호출합니다. 관리 코드에서 IDE가 더 이상 항목이 없다는 것을 알 수 있는 유일한 방법은 가능한 모든 항목을 먼저 만드는 것입니다. 원하는 경우 메뉴 명령이 생성된 후 mc.Visible = false;를 사용하여 추가 항목을 처음에는 보이지 않는 것으로 표시할 수 있습니다. 이러한 항목은 나중에 OnMRUQueryStatus 메서드에서 mc.Visible = true;를 사용하여 표시할 수 있습니다.

  6. 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;
            }
        }
    }
    
  7. OnMRUQueryStatus 메서드 뒤에 다음 OnMRUExec 메서드를 추가합니다. MRU 항목을 선택하는 처리기입니다. 이 메서드는 선택한 항목을 목록의 맨 위로 이동한 다음 선택한 항목을 메시지 상자에 표시합니다.

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

MRU 목록 테스트

  1. 프로젝트를 빌드하고 디버깅을 시작합니다.

  2. TestMenu 메뉴에서 Invoke TestCommand를 클릭합니다. 이렇게 하면 명령이 선택되었음을 나타내는 메시지 상자가 표시됩니다.

    참고 항목

    VSPackage가 MRU 목록을 로드하고 올바르게 표시하도록 하려면 이 단계가 필요합니다. 이 단계를 건너뛰면 MRU 목록이 표시되지 않습니다.

  3. 테스트 메뉴 메뉴에서 하위 메뉴를 클릭합니다. 4개의 항목 목록이 구분 기호 아래 하위 메뉴의 끝에 표시됩니다. 항목 3을 클릭하면 메시지 상자가 나타나고 선택한 항목 3이라는 텍스트가 표시되어야 합니다. (4개 항목의 목록이 표시되지 않으면 이전 단계의 지침을 따랐는지 확인합니다.)

  4. 하위 메뉴를 다시 엽니다. 이제 항목 3이 목록의 맨 위에 있고 다른 항목은 한 위치 아래로 밀려났습니다. 항목 3을 다시 클릭하고 메시지 상자에 선택한 항목 3이 계속 표시되는지 확인합니다. 이는 텍스트가 명령 레이블과 함께 새 위치로 올바르게 이동했음을 나타냅니다.