Share via


Visual Studio 도구 창 만들기

도구 창은 Visual Studio에 복잡한 UI 및 상호 작용을 추가하는 방법입니다. 일반적으로 다양한 API 및 기능과 상호 작용하는 사용자에게 친숙한 방법을 제공합니다. 예를 들어 솔루션 탐색기 도구 창은 현재 프로젝트/솔루션/폴더의 트리 기반 보기를 제공하고 파일 열기, 이름 바꾸기 및 만들기에 대한 간단한 제스처를 제공합니다.

도구 창은 단일 인스턴스입니다. 즉, 도구 창의 인스턴스를 한 번에 하나만 열 수 있습니다. 도구 창이 IDE에서 닫히면 문서처럼 완전히 닫히고 삭제되는 대신 눈에 띄게 숨겨집니다.

시작하기

시작하려면 첫 번째 확장 만들기 자습서를 따릅니다.

도구 창 작업

이 가이드는 도구 창으로 작업할 때 주요 사용자 시나리오를 다루도록 설계되었습니다.

도구 창 만들기

새 확장성 모델을 사용하여 도구 창을 만드는 것은 기본 클래스 ToolWindow 를 확장하고 클래스를 특성 VisualStudioContribution으로 표시하는 것만큼 간단합니다.

[VisualStudioContribution]
public class MyToolWindow : ToolWindow

ToolWindow 특성

추상 클래스를 ToolWindow 사용하려면 다음과 같은 몇 가지 속성을 포함하는 구성을 구현 ToolWindowConfiguration 해야 합니다.

매개 변수 Type 필수 설명 기본값
배치 ToolWindowPlacement 아니요 도구 창을 처음 열어야 하는 Visual Studio의 위치입니다. ToolWindowPlacement.DockedTo 에서는 도구 창을 이전 VSIX 스타일 도구 창 ID와 일치하는 GUID에 도킹할 수 있습니다. ToolWindowPlacement에 대해 자세히 알아보세요. ToolWindowPlacement.Floating
DockDirection 도킹 아니요 처음 열 때 도구 창을 도킹해야 하는 위치를 기준으로 하는 방향입니다. Dock를 참조하세요. Dock.None
AllowAutoCreation Bool 아니요 도구 창을 자동으로 만들 수 있는지 여부를 지정합니다. 이를 false로 설정하면 Visual Studio를 닫을 때 열려 있는 도구 창이 Visual Studio를 다시 열 때 자동으로 복원되지 않습니다. true

예시

[VisualStudioContribution]
public class MyToolWindow : ToolWindow
{
    public MyToolWindow(VisualStudioExtensibility extensibility)
        : base(extensibility)
    {
        this.Title = "My Tool Window";
    }

    public override ToolWindowConfiguration ToolWindowConfiguration => new()
    {
        Placement = ToolWindowPlacement.Floating,
        DockDirection = Dock.Right,
        AllowAutoCreation = true,
    };

    public override Task<IRemoteUserControl> GetContentAsync(CancellationToken cancellationToken)
    {
        // Create and return a RemoteUserControl
    }
}

도구 창에 콘텐츠 추가

VisualStudio.Extensibility의 확장은 IDE에서 처리되지 않을 수 있으므로 도구 창의 콘텐츠에 대한 프레젠테이션 계층으로 WPF를 직접 사용할 수 없습니다. 대신 도구 창에 콘텐츠를 추가하려면 RemoteUserControl 및 해당 컨트롤에 해당하는 데이터 템플릿을 만들어야 합니다. 아래에는 몇 가지 간단한 예제가 있지만 도구 창 콘텐츠를 추가할 때 원격 UI 설명서를 읽는 것이 좋습니다.

[VisualStudioContribution]
public class MyToolWindow : ToolWindow
{
    public MyToolWindow(VisualStudioExtensibility extensibility)
        : base(extensibility)
    {
        this.Title = "My Tool Window";
    }

    public override ToolWindowConfiguration ToolWindowConfiguration => new()
    {
        Placement = ToolWindowPlacement.DocumentWell,
    };

    public override async Task InitializeAsync(CancellationToken cancellationToken)
    {
        // Do any work here that is needed before creating the control.
    }

    public override Task<IRemoteUserControl> GetContentAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult<IRemoteUserControl>(new MyToolWindowControl());
    }
}

MyToolWindowControl.cs: (예제 파일 이름이며 데이터 템플릿 파일과 이름이 같아야 합니다.)

internal class MyToolWindowControl : RemoteUserControl
{
    public MyToolWindowControl()
        : base(dataContext: null)
    {
    }
}

MyToolWindowControl.xaml (예제 파일 이름이며 RemoteUserControl에서 파생되는 클래스와 이름이 같아야 합니다.)

<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:vs="http://schemas.microsoft.com/visualstudio/extensibility/2022/xaml">
    <Label></Label>
</DataTemplate>

RemoteUserControl 만들기 에 대한 자세한 내용은 리모트 UI를 참조하십시오.

도구 창을 표시하는 명령 만들기

도구 창을 표시하는 일반적인 메커니즘은 호출할 때 호출하여 도구 창을 표시하는 명령을 추가하는 것입니다 ShellExtensibility.ShowToolWindowAsync().

ShowToolWindowAsync() 부울 매개 변수 소유, activate:

  • 이 경우 true 도구 창이 IDE 에 표시되고 포커스가 지정됩니다.
  • 이 경우 false 도구 창이 IDE에 표시되지만 다른 도구 창이 활성화된 경우 탭 그룹의 탭으로만 표시될 수 있습니다.

예시

[VisualStudioContribution]
public class MyToolWindowCommand : Command
{
    public MyToolWindowCommand(VisualStudioExtensibility extensibility)
        : base(extensibility)
    {
    }
    
    public override CommandConfiguration CommandConfiguration => new("My Tool Window")
    {
        Placements = new[] { CommandPlacement.KnownPlacements.ToolsMenu },
        Icon = new(ImageMoniker.KnownValues.ToolWindow, IconSettings.IconAndText),
    };

    public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
    {
        await this.Extensibility.Shell().ShowToolWindowAsync<MyToolWindow>(activate: true, cancellationToken);
    }
}

명령을 만들고 사용하는 방법에 대한 자세한 내용은 명령 문서를 참조하세요.

도구 창의 표시 유형 제어

명령을 사용하는 것 외에 도구 창의 표시 유형을 제어하는 또 다른 방법은 규칙 기반 활성화 제약 조건을 사용하는 것입니다. 이렇게 하면 특정 조건이 충족될 때 도구 창이 자동으로 열리고 해당 조건이 더 이상 적용되지 않을 때 다시 숨길 수 있습니다.

ToolWindowVisibleWhenAttribute

VisibleWhen 특성에는 익숙해져야 하는 몇 가지 매개 변수가 있습니다.

매개 변수 Type 필수 설명
문자열 true이면 컨텍스트가 활성화되고 도구 창이 표시되는 부울 식 문자열입니다.
TermNames 문자열[] 식에 사용되는 용어의 이름입니다.
TermValues 문자열[] 각 용어의 값입니다. 용어 값은 용어 이름 배열과 동일한 순서여야 합니다.

예시

// The tool window will be shown if the active document is a .cs file, and
// will be hidden if the active document is any any other type of file.
public override ToolWindowConfiguration ToolWindowConfiguration => new()
{
    VisibleWhen = ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveSelectionFileName, @"\.cs$"),
};

유효한 용어 값에 대한 자세한 내용은 규칙 기반 활성화 제약 조건을 참조하세요.

다음 단계

VisualStudio.Extensibility 프레임워크에서 원격 UI가 작동하는 방식에 대해 자세히 알아봅니다.

도구 창 콘텐츠는 WPF를 사용하여 생성되므로 지침은 WPF 설명서를 참조하세요.

도구 창을 사용하여 확장을 만드는 전체 예제는 ToolWindow 샘플을 참조하세요.