Добавьте два или более окна инструментов в один и тот же проект Visual Studio.

Я пытался добавить второе окно инструментов в проект VSPackage в Visual Studio, у меня есть проект с окном инструментов, уже созданным с помощью мастера, предоставленного Visual Studio, когда создается проект VSPackage, я просматривал Интернет в поисках учебника это может помочь мне добавить второе окно инструментов в мой существующий проект VSPackage. Я прочитал несколько статей об окнах инструментов, но не могу найти решение. Я создаю новый класс

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Shell;

namespace Company.VSPackage1
{
    [Guid("759c7eb3-6850-4cce-b765-2d5902a90918")]
    public class OtherToolWindow : ToolWindowPane
    {
        public OtherToolWindow() :
            base(null)
        {
            this.Caption = Resources.OtherToolWindowTitle;
            this.BitmapResourceID = 301;
            this.BitmapIndex = 1;
        }
    }
}

И затем я несколько раз изменяю класс, унаследованный от Package, но что-то я делаю неправильно или упускаю

using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using Microsoft.Win32;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Shell;

namespace Company.VSPackage1
{
    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideMenuResource("Menus.ctmenu", 1)]
    [ProvideToolWindow(typeof(MyToolWindow))]
    [ProvideToolWindow(typeof(OtherToolWindow))]
    [Guid(GuidList.guidVSPackage1PkgString)]
    public sealed class VSPackage1Package : Package
    {
        public VSPackage1Package()
        {
            Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString()));
        }

        private void ShowToolWindow(object sender, EventArgs e)
        {
            ToolWindowPane window = this.FindToolWindow(typeof(MyToolWindow), 0, true);
            if ((null == window) || (null == window.Frame))
            {
                throw new NotSupportedException(Resources.CanNotCreateWindow);
            }
            IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
            Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());

        }

        private void ShowOtherToolWindow(object sender, EventArgs e)
        {
            ToolWindowPane otherWindow = this.FindToolWindow(typeof(OtherToolWindow), 0, true);
            if ((null == otherWindow) || (null == otherWindow.Frame))
            {
                throw new NotSupportedException(Resources.CanNotCreateWindow);
            }
            IVsWindowFrame otherWindowFrame = (IVsWindowFrame)otherWindow.Frame;
            Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(otherWindowFrame.Show());
        }

        protected override void Initialize()
        {
            Debug.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString()));
            base.Initialize();

            // Add our command handlers for menu (commands must exist in the .vsct file)
            OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;

            if ( null != mcs )
            {
                // Create the command for the tool window
                CommandID toolwndCommandID = new CommandID(GuidList.guidVSPackage1CmdSet, (int)PkgCmdIDList.cmdidMyTool);
                MenuCommand menuToolWin = new MenuCommand(ShowToolWindow, toolwndCommandID);

                CommandID toolwndCommandID2 = new CommandID(GuidList.guidVSPackage1CmdSet2, (int)PkgCmdIDList.cmdidMyTool2);
                MenuCommand menuToolWin2 = new MenuCommand(ShowOtherToolWindow, toolwndCommandID2);

                mcs.AddCommand( menuToolWin );
                mcs.AddCommand(menuToolWin2);
            }

        }
    }
}

Я просто хочу добавить более одного окна инструментов в один и тот же пакет vspackage в Visual Studio.


person Jack1987    schedule 20.02.2015    source источник
comment
См. stackoverflow.com/questions/28450237/   -  person Sergey Vlasov    schedule 20.02.2015
comment
В чем проблема? 1) Команда/кнопка для второго окна инструментов не отображается в Видах›Другие окна 2) Нажатие кнопки для создания окна инструментов вызывает исключение Не удается создать окно 3) Окно инструментов отображается, но без размещенных элементов управления 4) ....   -  person Carlos Quintero    schedule 20.02.2015
comment
Я бы не стал публиковать Guid в сети; так как я слышал о людях, которые копируют/вставляют код, найденный на SO, прямо в свои проекты (-:   -  person Matze    schedule 20.02.2015


Ответы (1)


Это точно неправильно:

 CommandID toolwndCommandID2 = new CommandID(GuidList.guidVSPackage1CmdSet2, (int)PkgCmdIDList.cmdidMyTool2);

Должен быть:

 CommandID toolwndCommandID2 = new CommandID(GuidList.guidVSPackage1CmdSet, (int)PkgCmdIDList.cmdidMyTool2);

И вам нужно исправить файл .vsct и файл Guids.cs, которые вы не опубликовали.

То есть пакет имеет один набор команд, который может иметь несколько команд.

FWIW, я работаю над учебником по созданию окон инструментов. Вот:

HOWTO: Создайте окно инструментов с помощью класса ToolWindowPane в пакете Visual Studio http://www.visualstudioextensibility.com/2015/02/20/mz-tools-articles-series-howto-create-a-toolwindow-with-a-toolwindowpane-class-in-a-visual-studio-package/

person Carlos Quintero    schedule 20.02.2015