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 샘플을 참조하세요.