다음을 통해 공유


도구 창에 바로 가기 메뉴 추가

이 연습에서는 도구 창에 바로 가기 메뉴를 배치합니다. 바로 가기 메뉴는 사용자가 단추, 텍스트 상자 또는 창 배경을 마우스 오른쪽 단추로 클릭할 때 나타나는 메뉴입니다. 바로 가기 메뉴의 명령은 다른 메뉴 또는 도구 모음의 명령과 동일하게 작동합니다. 바로 가기 메뉴를 지원하려면 .vsct 파일에서 메뉴를 지정하고 마우스 오른쪽 단추 클릭에 대한 응답으로 표시합니다.

도구 창은 ToolWindowPane에서 상속하는 사용자 지정 도구 창 클래스의 WPF 사용자 정의 컨트롤로 구성됩니다.

이 연습에서는 .vsct 파일에서 메뉴 항목을 선언한 다음 관리되는 패키지 프레임워크를 사용해 도구 창을 정의하는 클래스에서 메뉴 항목을 구현하여 Visual Studio 메뉴로 바로 가기 메뉴를 만드는 방법을 보여 줍니다. 이 방법을 사용하면 Visual Studio 명령, UI 요소 및 자동화 개체 모델에 쉽게 액세스할 수 있습니다.

또는 바로 가기 메뉴가 Visual Studio 기능에 액세스하지 않는 경우 사용자 정의 컨트롤에서 XAML 요소의 ContextMenu 속성을 사용할 수 있습니다. 자세한 내용은 ContextMenu를 참조하세요.

도구 창 바로 가기 메뉴 패키지 만들기

  1. TWShortcutMenu라는 VSIX 프로젝트를 만들고 ShortcutMenu라는 도구 창 템플릿을 추가합니다. 도구 창을 만드는 방법에 대한 자세한 내용은 도구 창을 사용하여 확장 만들기를 참조하세요.

바로 가기 메뉴 지정

이 연습에 표시된 것과 같은 바로 가기 메뉴를 사용하면 사용자가 도구 창의 배경을 채우는 데 사용되는 색 목록에서 선택할 수 있습니다.

  1. ShortcutMenuPackage.vsct에서 guidShortcutMenuPackageCmdSet이라는 GuidSymbol 요소를 찾아 바로 가기 메뉴, 바로 가기 메뉴 그룹 및 메뉴 옵션을 선언합니다. GuidSymbol 요소는 이제 다음과 같이 표시됩니다.

    <GuidSymbol name="guidShortcutMenuPackageCmdSet" value="{00000000-0000-0000-0000-0000}"> // your GUID here
        <IDSymbol name="ShortcutMenuCommandId" value="0x0100" />
        <IDSymbol name="ColorMenu" value="0x1000"/>
        <IDSymbol name="ColorGroup" value="0x1100"/>
        <IDSymbol name="cmdidRed" value="0x102"/>
        <IDSymbol name="cmdidYellow" value="0x103"/>
        <IDSymbol name="cmdidBlue" value="0x104"/>
    </GuidSymbol>
    
  2. Buttons 요소 바로 앞에 Menus 요소를 만든 다음 바로 가기 메뉴를 정의합니다.

    <Menus>
      <Menu guid="guidShortcutMenuPackageCmdSet" id="ColorMenu" type="Context">
        <Strings>
          <ButtonText>Color change</ButtonText>
          <CommandName>ColorChange</CommandName>
        </Strings>
      </Menu>
    </Menus>
    

    바로 가기 메뉴는 메뉴 또는 도구 모음의 일부가 아니므로 부모가 없습니다.

  3. 바로 가기 메뉴 항목이 포함된 Group 요소를 사용하여 Groups 요소를 만들고 그룹을 바로 가기 메뉴와 연결합니다.

    <Groups>
        <Group guid="guidShortcutMenuPackageCmdSet" id="ColorGroup">
            <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorMenu"/>
        </Group>
    </Groups>
    
  4. Buttons 요소에서 바로 가기 메뉴에 표시될 개별 명령을 정의합니다. Buttons 요소는 이제 다음과 같이 표시됩니다.

    <Buttons>
        <Button guid="guidShortcutMenuPackageCmdSet" id="ShortcutMenuCommandId" priority="0x0100" type="Button">
            <Parent guid="guidSHLMainMenu" id="IDG_VS_WNDO_OTRWNDWS1"/>
            <Icon guid="guidImages" id="bmpPic1" />
            <Strings>
                <ButtonText>ShortcutMenu</ButtonText>
            </Strings>
        </Button>
    
        <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidRed" priority="1" type="Button">
            <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" />
            <Strings>
                <ButtonText>Red</ButtonText>
            </Strings>
        </Button>
    
        <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidYellow" priority="3" type="Button">
            <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" />
            <Strings>
                <ButtonText>Yellow</ButtonText>
            </Strings>
        </Button>
    
        <Button guid="guidShortcutMenuPackageCmdSet" id="cmdidBlue" priority="5" type="Button">
            <Parent guid="guidShortcutMenuPackageCmdSet" id="ColorGroup" />
            <Strings>
                <ButtonText>Blue</ButtonText>
            </Strings>
        </Button>
    </Buttons>
    
  5. ShortcutMenuCommand.cs에서 명령 집합 GUID, 바로 가기 메뉴 및 메뉴 항목에 대한 정의를 추가합니다.

    public const string guidShortcutMenuPackageCmdSet = "00000000-0000-0000-0000-00000000"; // your GUID will differ
    public const int ColorMenu = 0x1000;
    public const int cmdidRed = 0x102;
    public const int cmdidYellow = 0x103;
    public const int cmdidBlue = 0x104;
    

    ShortcutMenuPackage.vsct 파일의 Symbols 섹션에 정의된 것과 동일한 명령 ID입니다. 컨텍스트 그룹은 .vsct 파일에만 필요하므로 여기에 포함되지 않습니다.

바로 가기 메뉴 구현

이 섹션에서는 바로 가기 메뉴와 해당 명령을 구현합니다.

  1. ShortcutMenu.cs에서 도구 창은 메뉴 명령 서비스를 가져올 수 있지만 포함된 컨트롤은 가져올 수 없습니다. 다음 단계에서는 메뉴 명령 서비스를 사용자 정의 컨트롤에 사용할 수 있도록 하는 방법을 보여 줍니다.

  2. ShortcutMenu.cs에서 다음 using 지시문을 추가합니다.

    using Microsoft.VisualStudio.Shell;
    using System.ComponentModel.Design;
    
  3. 도구 창의 Initialize() 메서드를 재정의하여 메뉴 명령 서비스를 가져오고 컨트롤을 추가하여 메뉴 명령 서비스를 생성자에 전달합니다.

    protected override void Initialize()
    {
        var commandService = (OleMenuCommandService)GetService(typeof(IMenuCommandService));
        Content = new ShortcutMenuControl(commandService);
    }
    
  4. ShortcutMenu 도구 창 생성자에서 컨트롤을 추가하는 줄을 제거합니다. 생성자는 이제 다음과 같이 표시됩니다.

    public ShortcutMenu() : base(null)
    {
        this.Caption = "ShortcutMenu";
        this.BitmapResourceID = 301;
        this.BitmapIndex = 1;
    }
    
  5. ShortcutMenuControl.xaml.cs에서 메뉴 명령 서비스에 대한 프라이빗 필드를 추가하고 메뉴 명령 서비스를 사용하도록 컨트롤 생성자를 변경합니다. 그런 다음 메뉴 명령 서비스를 사용하여 바로 가기 메뉴 명령을 추가합니다. 이제 ShortcutMenuControl 생성자는 다음 코드와 같아야 합니다. 명령 처리기는 나중에 정의됩니다.

    public ShortcutMenuControl(OleMenuCommandService service)
    {
        this.InitializeComponent();
        commandService = service;
    
        if (null !=commandService)
        {
            // Create an alias for the command set guid.
            Guid guid = new Guid(ShortcutMenuCommand.guidShortcutMenuPackageCmdSet);
    
            // Create the command IDs.
            var red = new CommandID(guid, ShortcutMenuCommand.cmdidRed);
            var yellow = new CommandID(guid, ShortcutMenuCommand.cmdidYellow);
            var blue = new CommandID(guid, ShortcutMenuCommand.cmdidBlue);
    
            // Add a command for each command ID.
            commandService.AddCommand(new MenuCommand(ChangeColor, red));
            commandService.AddCommand(new MenuCommand(ChangeColor, yellow));
            commandService.AddCommand(new MenuCommand(ChangeColor, blue));
        }
    }
    
  6. ShortcutMenuControl.xaml에서 MouseRightButtonDown 이벤트를 최상위 요소 UserControl에 추가합니다. XAML 파일은 이제 다음과 같이 표시됩니다.

    <UserControl x:Class="TWShortcutMenu.ShortcutMenuControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            Background="{DynamicResource VsBrush.Window}"
            Foreground="{DynamicResource VsBrush.WindowText}"
            mc:Ignorable="d"
            d:DesignHeight="300" d:DesignWidth="300"
            Name="MyToolWindow"
            MouseRightButtonDown="MyToolWindow_MouseRightButtonDown">
        <Grid>
            <StackPanel Orientation="Vertical">
                <TextBlock Margin="10" HorizontalAlignment="Center">ShortcutMenu</TextBlock>
            </StackPanel>
        </Grid>
    </UserControl>
    
  7. ShortcutMenuControl.xaml.cs에서 이벤트 처리기에 대한 스텁을 추가합니다.

    private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
    . . .
    }
    
  8. 다음 using 지시문을 동일한 파일에 추가합니다.

    using Microsoft.VisualStudio.Shell;
    using System.ComponentModel.Design;
    using System;
    using System.Windows.Input;
    using System.Windows.Media;
    
  9. 다음과 같이 MyToolWindowMouseRightButtonDown 이벤트를 구현합니다.

    private void MyToolWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (null != commandService)
        {
            CommandID menuID = new CommandID(
                new Guid(ShortcutMenuCommand.guidShortcutMenuPackageCmdSet),
                ShortcutMenuCommand.ColorMenu);
            Point p = this.PointToScreen(e.GetPosition(this));
            commandService.ShowContextMenu(menuID, (int)p.X, (int)p.Y);
        }
    }
    

    그러면 바로 가기 메뉴에 대한 CommandID 개체가 만들어지고, 마우스 클릭 위치가 식별되고, ShowContextMenu 메서드를 사용하여 해당 위치에서 바로 가기 메뉴가 열립니다.

  10. 명령 처리기를 구현합니다.

    private void ChangeColor(object sender, EventArgs e)
    {
        var mc = sender as MenuCommand;
    
        switch (mc.CommandID.ID)
        {
            case ShortcutMenuCommand.cmdidRed:
                MyToolWindow.Background = Brushes.Red;
                break;
            case ShortcutMenuCommand.cmdidYellow:
                MyToolWindow.Background = Brushes.Yellow;
                break;
            case ShortcutMenuCommand.cmdidBlue:
                MyToolWindow.Background = Brushes.Blue;
                break;
        }
    }
    

    이 경우 하나의 메서드가 CommandID를 식별하고 그에 따라 배경 색을 설정하여 모든 메뉴 항목에 대한 이벤트를 처리합니다. 메뉴 항목에 관련이 없는 명령이 포함되어 있으면 각 명령에 대해 별도의 이벤트 처리기를 만들었을 것입니다.

도구 창 기능 테스트

  1. 프로젝트를 빌드하고 디버깅을 시작합니다. 실험적 인스턴스가 나타납니다.

  2. 실험적 인스턴스에서 보기/다른 창을 클릭한 다음 ShortcutMenu를 클릭합니다. 이렇게 하면 도구 창이 표시됩니다.

  3. 도구 창의 본문을 마우스 오른쪽 단추로 클릭합니다. 색 목록이 있는 바로 가기 메뉴가 표시됩니다.

  4. 바로 가기 메뉴에서 색을 클릭합니다. 도구 창 배경색이 선택한 색으로 변경됩니다.