共用方式為


組建自訂工具視窗

自訂工具視窗是將複雜 UI 新增至 Visual Studio 的絕佳選項。

工具視窗是 Visual Studio 中的核心 UI 概念,下列影片將示範如何新增自訂視窗。

工具視窗是一個可以移動並停駐的視窗,就像 [方案總管]、[錯誤清單] 和其他已知的工具視窗一樣。 工具視窗是由 Visual Studio 所提供的外部殼層和自訂內部 UI 控制項所組成,通常是擴充工具所提供的 XAML <usercontrol>

注意

若要使用工具視窗建立新的擴充功能,請使用 VSIX Project w/Tool Window (Community) 範本建立新專案,並略過此配方的其餘部分。 如需詳細資訊,請參閱使用者入門

將工具視窗新增至現有的擴充功能需要 4 個簡單的步驟:

  1. 建立工具視窗外部殼層類別。
  2. 將 XAML <usercontrol>新增至工具視窗。
  3. 註冊工具視窗。
  4. 建立命令以顯示工具視窗。

讓我們從步驟 1 開始。

建立工具視窗

使用 BaseToolWindow<T> 泛型基類時,系統會要求您提供一些基本資訊。 我們必須指定工具視窗的標題、建立及傳回 XAML 使用者控制項,以及設定 Visual Studio 用來建立視窗外部殼層的實際 ToolWindowPane 類別。

using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using Community.VisualStudio.Toolkit;
using EnvDTE80;
using Microsoft.VisualStudio.Imaging;
using Microsoft.VisualStudio.Shell;

public class MyToolWindow : BaseToolWindow<MyToolWindow>
{
    public override string GetTitle(int toolWindowId) => "My Tool Window";

    public override Type PaneType => typeof(Pane);

    public override async Task<FrameworkElement> CreateAsync(int toolWindowId, CancellationToken cancellationToken)
    {
        await Task.Delay(2000); // Long running async task
        return new MyUserControl();
    }

    // Give this a new unique guid
    [Guid("d3b3ebd9-87d1-41cd-bf84-268d88953417")] 
    internal class Pane : ToolWindowPane
    {
        public Pane()
        {
            // Set an image icon for the tool window
            BitmapImageMoniker = KnownMonikers.StatusInformation;
        }
    }
}

您必須從 CreateAsync(int, CancellationToken) 方法建立自訂使用者控制項的執行個體,然後由 Visual Studio 建立時自動傳遞至工具視窗殼層。

但首先,您必須建立使用者控制項。

新增 XAML 使用者控制項

它可以是任何具有其程式碼後置類別的 XAML,因此以下是包含單一按鈕的 <usercontrol> 簡單範例:

<UserControl x:Class="MyUserControl"
             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"
             xmlns:toolkit="clr-namespace:Community.VisualStudio.Toolkit;assembly=Community.VisualStudio.Toolkit"
             mc:Ignorable="d"
             toolkit:Themes.UseVsTheme="True"
             d:DesignHeight="300" d:DesignWidth="300"
             Name="MyToolWindow">
    <Grid>
        <StackPanel Orientation="Vertical">
            <Label Margin="10" HorizontalAlignment="Center">My Window</Label>
            <Button Content="Click me!" Click="button1_Click" Width="120" Height="80" Name="button1"/>
        </StackPanel>
    </Grid>
</UserControl>

現在,我們有可傳回自訂控制項的工具視窗類別。 下一個步驟是向 Visual Studio 註冊我們的工具視窗。

註冊工具視窗

註冊工具視窗表示我們要告訴 Visual Studio 其存在,以及如何將其具現化。 我們使用 [ProvideToolWindow] 屬性從套件類別中執行此動作。

[ProvideToolWindow(typeof(MyToolWindow.Pane))]
public sealed class MyPackage : ToolkitPackage
{
     protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
     {
         this.RegisterToolWindows();
     }
}

注意

請注意,封裝類別必須繼承自 ToolkitPackage ,而不是繼承自 PackageAsyncPackage

您可以指定工具視窗應該具有的樣式,以及預設應該顯示的位置。 下列範例顯示工具視窗應該放在與連結樣式中 [方案總管] 相同的停駐容器中。

[ProvideToolWindow(typeof(MyToolWindow.Pane), Style = VsDockStyle.Linked, Window = WindowGuids.SolutionExplorer)]

若要讓工具視窗預設可見,可以使用 [ProvideToolWindowVisibility] 屬性,在不同的 UI 內容中指定其可見度。

[ProvideToolWindowVisibility(typeof(MyToolWindow.Pane), VSConstants.UICONTEXT.NoSolution_string)]

顯示工具視窗的命令

這與任何其他命令相同,而且您可以查看如何在功能表和命令配方中新增命令。

顯示工具視窗的指令處理常式類別,看起來像這樣:

using Community.VisualStudio.Toolkit;
using Microsoft.VisualStudio.Shell;
using Task = System.Threading.Tasks.Task;

[Command(PackageIds.RunnerWindow)]
internal sealed class MyToolWindowCommand : BaseCommand<MyToolWindowCommand>
{
    protected override async Task ExecuteAsync(OleMenuCmdEventArgs e) =>
        await MyToolWindow.ShowAsync();
}

工具視窗的命令放置通常位於主功能表中的檢視 -> 其他視窗底下。

這樣就大功告成了。 恭喜,您現在已建立自訂工具視窗。

取得原始程式碼

您可以在範例存放庫中找到本配方的原始程式碼。