Criar uma janela de ferramenta de várias instâncias

Você pode programar uma janela de ferramenta para que várias instâncias dela possam ser abertas simultaneamente. Por padrão, as janelas de ferramentas podem ter apenas uma instância aberta.

Ao usar uma janela de ferramenta de várias instâncias, você pode mostrar várias fontes de informações relacionadas ao mesmo tempo. Por exemplo, você pode colocar um controle de várias linhas TextBox em uma janela de ferramenta de várias instâncias para que vários trechos de código estejam disponíveis simultaneamente durante uma sessão de programação. Além disso, por exemplo, você pode colocar um DataGrid controle e uma caixa de listagem suspensa em uma janela de ferramenta de várias instâncias para que várias fontes de dados em tempo real possam ser rastreadas simultaneamente.

Criar uma janela de ferramenta básica (instância única)

  1. Crie um projeto chamado MultiInstanceToolWindow usando o modelo VSIX e adicione um modelo de item de janela de ferramenta personalizado chamado MIToolWindow.

    Observação

    Para obter mais informações sobre como criar uma extensão com uma janela de ferramenta, consulte Criar uma extensão com uma janela de ferramenta.

Criar uma janela de ferramenta em várias instâncias

  1. Abra o arquivo MIToolWindowPackage.cs e localize o ProvideToolWindow atributo. e o MultiInstances=true parâmetro, conforme mostrado no exemplo a seguir:

    [PackageRegistration(UseManagedResourcesOnly = true)]
        [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] // Info on this package for Help/About
        [ProvideMenuResource("Menus.ctmenu", 1)]
        [ProvideToolWindow(typeof(MultiInstanceToolWindow.MIToolWindow), MultiInstances = true)]
        [Guid(MIToolWindowPackage.PackageGuidString)]
        public sealed class MIToolWindowPackage : Package
    {. . .}
    
  2. No arquivo MIToolWindowCommand.cs localize, localize o ShowToolWindos() método. Nesse método, chame o método e defina seu create sinalizador para false que ele itere FindToolWindow pelas instâncias existentes da janela de ferramenta até que um disponível id seja encontrado.

  3. Para criar uma instância de janela de ferramenta, chame o método e defina-o FindToolWindow id como um valor disponível e seu create sinalizador como true.

    Por padrão, o valor do parâmetro do id FindToolWindow método é 0. Esse valor cria uma janela de ferramenta de instância única. Para que mais de uma instância seja hospedada, cada instância deve ter seu próprio idarquivo exclusivo .

  4. Chame o Show IVsWindowFrame método no objeto retornado pela Frame propriedade da instância da janela de ferramenta.

  5. Por padrão, o ShowToolWindow método criado pelo modelo de item de janela de ferramenta cria uma janela de ferramenta de instância única. O exemplo a seguir mostra como modificar o ShowToolWindow método para criar várias instâncias.

    private void ShowToolWindow(object sender, EventArgs e)
    {
        for (int i = 0; i < 10; i++)
        {
            ToolWindowPane window = this.package.FindToolWindow(typeof(MIToolWindow), i, false);
            if (window == null)
            {
                // Create the window with the first free ID.
                window = (ToolWindowPane)this.package.FindToolWindow(typeof(MIToolWindow), i, true);
                if ((null == window) || (null == window.Frame))
                {
                    throw new NotSupportedException("Cannot create tool window");
                }
    
            IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
            Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());
            break;
            }
        }
    }