Поделиться через


Пошаговое руководство: Интеграция с окном свойств, списком задач, окном вывода, и диалоговым окном "Параметры" (Часть 4 из 4)

С помощью SDK для Visual Studioможно включить код для доступа к любое окно инструментов in Visual Studio. Например, можно добавить записи в Список задачдобавьте текст Вывод окно или интегрируется в расширение Свойства окно, чтобы пользователи могли настроить расширение путем задания свойства. В этом пошаговом руководстве показано, как интегрировать модуль в окне инструментов in Visual Studio.

Путем выполнения этого пошагового руководства, можно получить сведения о том, как выполнить следующие действия:

  • Создайте VSPackage с помощью шаблона пакета.

  • Реализуйте созданное окно инструментов.

  • Реализуйте обработчик команд меню.

  • Создайте страницу параметров.

  • Сделать данные доступными для Свойства окна.

  • Интеграция в окне свойства.

  • Добавление текста в Вывод окно и элементов в Список задач.

Это пошаговое руководство является частью ряда, изучите, как расширить интегрированной среды разработки Visual Studio. Дополнительные сведения см. в разделе Пошаговые руководства по Visual Studio для настройки с помощью VSPackages.

Обязательные компоненты

Чтобы выполнить это пошаговое руководство, необходимо устанавливать SDK для Visual Studio 2010.

Примечание

Дополнительные сведения о пакете SDK для Visual Studio см. в разделе интеграция SDK Visual Studio.Чтобы узнать, как загрузить пакет SDK для Visual Studio см. в разделе Центр разработчиков расширяемости Visual Studio на веб-сайте MSDN.

Расположения для шаблона проекта пакета Visual Studio

Шаблон проекта пакета Visual Studio могут находиться в разных местах в 3 Создать проект диалоговое окно:

  1. Под моделью расширяемости Visual Basic. Язык по умолчанию для проекта Visual Basic.

  2. Под расширяемостью c#. Язык по умолчанию для проекта c#.

  3. Под другой моделью расширяемости типов проектов. Язык по умолчанию для проекта C++.

Создайте VSPackage с помощью шаблона пакета Visual Studio

Создание VSPackage

  1. Создайте VSPackage. Дополнительные сведения о создании VSPackage см. в разделе Пошаговое руководство: Создание команды меню ресурсов с помощью шаблона пакета Visual Studio.

  2. Назовите проект TodoListустановите язык Visual c# или Visual Basic, а на Выберите параметры пакета VSPackage страница выберите оба Команда меню и Окно инструментов.

  3. На Параметры команды страница, набор Имя команды В диспетчер Todo и Идентификатор команды В cmdidTodoCommand.

  4. На Параметры окна инструментов страница, набор имя окна В диспетчер Todo и Идентификатор команды В cmdidTodoTool.

  5. Нажмите кнопку Готово.

Реализуйте созданное окно инструментов

Шаблон пакета, сформировавшего основное окно инструментов в форме пользовательского элемента управления. Однако он не содержит никаких функций. Чтобы присвоить ей функции, необходимо добавить дочерние элементы управления и изменить код в MyControl.xaml.cs или MyControl.vb.

Окно инструментов включит a TextBox в, чтобы ввести новый элемент ToDo, a Button добавить новый элемент в список, а a ListBox отображать элементы в списке. Завершенное окно инструментов должно напоминать следующее изображение.

Окно завершенных инструментов.

Добавление элементов управления в окно инструментов

  1. Удаление кнопки текст и элементы управления StackPanel из сетки.

    Примечание

    Это не удаляет обработчик событий, button1_Click повторном использовании в последующем шаге.

  2. От Все элементы управления WPF раздел Панель элементовперетащите a Холст элемент управления к сетке.

  3. Перетащите элемент управления TextBox, элемент управления " Кнопка ", а элемент управления ListBox на основе. Расположите их как в диаграмме выше.

  4. Выберите кнопку. Установите его Содержимое свойство Добавить.

  5. На панели язык XAML, подключите повторно обработчик событий кнопки элемент управления " Кнопка " путем добавления атрибута Click= " button1_Click". Полученная линия XAML может выглядеть следующим образом:

    Public _parent As MyToolWindow
    Public Sub New(ByVal parent As MyToolWindow)
        InitializeComponent()
        _parent = parent
    End Sub
    
    <Button Content="Add" Height="21" Name="button1" Width="50" Canvas.Left="345" Canvas.Top="6" Click="button1_Click" />
    

    Сохраните результаты работы.

По умолчанию конструктор пользовательского элемента управления в файле MyControl.xaml.cs или MyControl.xaml.vb не принимает параметры. Однако можно настраивать конструктор, чтобы включить параметры, чтобы можно было сохранить родительским для последующего использования.

Настройка конструктора

  1. На странице конструктора щелкните правой кнопкой мыши Просмотр кода.

  2. Замените существующий конструктор следующим кодом:

    public MyToolWindow _parent;
    public MyControl(MyToolWindow parent)
    {
        InitializeComponent();
        _parent = parent;
    }
    

    Это позволяет конструктору выполнить параметр типа MyToolWindow.

  3. Сохраните результаты работы.

  4. Теперь добавьте параметр коду, который вызывает конструктор.

    IN Обозреватель решенийоткрыть MyToolWindow.cs или MyToolWindow.vb.

  5. Найдите линию в конструкторе MyToolWindow, похожий на следующий код.

    Me.Content = New MyControl()
    
    base.Content = new MyControl();
    
  6. Изменить линию следующим образом.

    Me.Content = New MyControl(Me)
    
    base.Content = new MyControl(this);
    

    Это передает экземпляр окна инструментов к пользовательскому элементу управления. (Это необходимо, что в более позднем шаге создает конструктор для класса ToDoItem.)

Реализуйте обработчик команд меню

Когда проект TodoList был создан, он содержал используемый по умолчанию обработчик для пункта меню. Обработчик в файле TodoListPackage. Теперь добавьте код в обработчик события для отображения окна инструментов. Это можно сделать в нескольких шагах, поскольку TodoListPackage уже содержит функцию с именем ShowToolWindow.

Реализовать обработчик пункта меню

  1. Откройте TodoListPackage.cs или TodoListPackage.vb. Обратите внимание, что обработчик пункта меню содержит следующий образец кода.

    Private Sub MenuItemCallback(ByVal sender As Object, ByVal e As EventArgs)
        ' Show a Message Box to prove we were here 
        Dim uiShell As IVsUIShell = TryCast(GetService(GetType(SVsUIShell)), IVsUIShell)
        Dim clsid As Guid = Guid.Empty
        Dim result As Integer
        Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(uiShell.ShowMessageBox(0, clsid, "TodoList", String.Format(CultureInfo.CurrentCulture, "Inside {0}.MenuItemCallback()", Me.GetType().Name), String.Empty, 0, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO, 0, result))
    End Sub
    
    private void MenuItemCallback(object sender, EventArgs e)
    {
        // Show a Message Box to prove we were here
        IVsUIShell uiShell = (IVsUIShell)GetService(typeof(SVsUIShell));
        Guid clsid = Guid.Empty;
        int result;
        Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(uiShell.ShowMessageBox(
                   0,
                   ref clsid,
                   "TodoList",
                   string.Format(CultureInfo.CurrentCulture, "Inside {0}.MenuItemCallback()", this.ToString()),
                   string.Empty,
                   0,
                   OLEMSGBUTTON.OLEMSGBUTTON_OK,
                   OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST,
                   OLEMSGICON.OLEMSGICON_INFO,
                   0,        // false 
                   out result));
    }
    
  2. Удалите все функции и замените его вызовом ShowToolWindow следующим образом.

    Private Sub MenuItemCallback(ByVal sender As Object, ByVal e As EventArgs)
        ShowToolWindow(sender, e)
    End Sub
    
    private void MenuItemCallback(object sender, EventArgs e)
    {
        ShowToolWindow(sender, e);
    }        
    

    Сохраните результаты работы, а затем клавишу F5 для построения проекта и открыть его в экспериментальном построении Visual Studio. Тест открывается ли окно инструментов, щелкнув диспетчер Todo на Сервис меню.

    Закройте экспериментальном построении перед продолжением.

Создайте страницу Параметры

Можно предоставить страницу Параметры откроется диалоговое окно, чтобы пользователи могли изменение параметров окна инструментов. Создание страницы Параметры требует и класса, который описывает параметры и запись в файле TodoListPackage.cs или TodoListPackage.vb.

Создание страницы Параметры

  1. IN Обозреватель решенийщелкните правой кнопкой мыши проект, выберите пункт ToDoList Добавить, а затем нажмите кнопку Класс.

  2. в Добавление нового элемента диалоговое окно ", назовите файл ToolsOptions.csили ToolsOptions.vb затем перейдите Добавить.

    Visual Studio создается класс с именем ToolsOptions в этом файле, но необходимо изменить заголовок класса, чтобы класс является производным от DialogPage.

    Добавление Microsoft.VisualStudio.Shell пространство имен/к существующим с помощью директивы записей следующим образом.

    Imports Microsoft.VisualStudio.Shell
    
    using Microsoft.VisualStudio.Shell;
    
  3. Изменение ToolsOptions объявление класса, который должен наследовать из DialogPage.

    Inherits DialogPage
    
    class ToolsOptions : DialogPage
    
  4. Страница Параметры в этом пошаговом руководстве содержатся только одно DaysAhead с именем параметром. Чтобы добавить этот параметр, DaysAhead добавьте свойство к классу ToolsOptions следующим образом.

    Private _daysAhead As Double 
    
    Public Property DaysAhead() As Double 
        Get 
            Return _daysAhead
        End Get 
        Set(ByVal value As Double)
            _daysAhead = value
        End Set 
    End Property
    
    private double _daysAhead;
    
    public double DaysAhead
    {
        get { return _daysAhead; }
        set { _daysAhead = value; }
    }
    

    Этот класс содержит один параметр как именованный _daysAhead частный член. Класс затем предоставляет открытое свойство с именем DaysAhead для доступа к параметра.

  5. Сохраните файл.

Теперь необходимо выполнить проект с учетом данной страницы параметров так как она будет зарегистрирована правильно и доступным для пользователей.

Освободить страницы параметров пользователей

  1. IN обозреватель решенийоткрыть TodoListPackage.cs или TodoListPackage.vb.

  2. Найдите линия, содержащий ProvideToolWindowAttribute атрибут, а затем добавляет a ProvideOptionPageAttribute атрибут сразу после его следующим образом.

    <PackageRegistration(UseManagedResourcesOnly:=True), _
    InstalledProductRegistration("#110", "#112", "1.0", IconResourceID:=400), _
    ProvideMenuResource("Menus.ctmenu", 1), _
    ProvideToolWindow(GetType(MyToolWindow)), _
    ProvideOptionPage(GetType(ToolsOptions), "To-Do", "General", 101, 106, True), _
    Guid(GuidList.guidTodoListPkgString)> _
    Public NotInheritable Class TodoListPackage
        Inherits Package
    
    [ProvideToolWindow(typeof(MyToolWindow))]
    [ProvideOptionPage(typeof(ToolsOptions), "To-Do", "General", 101, 106, true)]
    

    Примечание

    Не следует включать машинное слово "атрибут" в объявлениях атрибутов.

  3. Сохраните файл.

    Первый параметр в конструктор ProvideOptionPage тип класса ToolsOptions, созданный ранее. Второй параметр "имя категории в дело" Параметры диалоговое окно. Третий параметр "общие" имя " подкатегория " Параметры диалоговое окно Параметры, где страница будет доступна. Следующие 2 параметра идентификаторы ресурсов для строк; первое имя категории, а второе имя подкатегории. Окончательное устанавливает параметр ли эта страница может обращаться с помощью автоматизации.

    Если страница Параметры доступна, она должна напоминать следующее изображение.

    Страница параметров

    Обратите внимание, что дело категории и подкатегории. общие сведения

Сделать данные доступными в окно свойств

Следующими принципами для хорошего объектно-ориентированной разработки можно сделать класс с именем ToDoItem, которое хранит сведения об отдельных элементах в списке дел.

Сделать данные доступными в окне свойств

  1. IN Обозреватель решенийщелкните правой кнопкой мыши проект, выберите пункт ToDoList Добавить, а затем нажмите кнопку Класс.

  2. в Добавление нового элемента диалоговое окно ", назовите файл ToDoItem.cs OR ToDoItem.vb, а затем нажмите кнопку Добавить.

    , Если окно инструментов будет доступен пользователям, элементы ListBox будут представлены экземплярами ToDoItem. Когда пользователь выбирает один из этих элементов ListBox, Свойства окно отображает сведения об элементе.

    Сделать данные доступными в Свойства окно, делает данные из открытых свойств класса, а затем документа их с помощью специальных атрибутов 2, описания и категории. Описание текст, который отображается в нижней части Свойства окна. Категория определяет, где должно появиться при свойство Свойства окно отображается в классифицированном представлении. На рисунке ниже, Свойства окно в классифицированном представлении Имя свойство Поля дела выбрана категорию и описание Имя свойство отображается в нижней части окна.

    Окно "Свойства"

  3. Добавьте следующие пространства имен в начало файла ToDoItem.cs или ToDoItem.vb после существовать с помощью/выписки записей.

    Imports System.ComponentModel
    Imports System.Windows.Forms
    Imports Microsoft.VisualStudio.Shell.Interop
    
    using System.ComponentModel;
    using System.Windows.Forms;
    using Microsoft.VisualStudio.Shell.Interop;
    
  4. Begin, реализующий класс ToDoItem следующим образом. Убедитесь, что добавление public доступ к модификатор к объявлению класса.

    Private _name As String
    <Description("Name of the To-Do item")> _
    <Category("To-Do Fields")> _
    Public Property Name() As String 
        Get 
            Return _name
        End Get 
        Set(ByVal value As String)
            _name = value
            _parent.UpdateList(Me)
        End Set 
    End Property 
    
    Private _dueDate As Date
    <Description("Due date of the To-Do item")> _
    <Category("To-Do Fields")> _
    Public Property DueDate() As Date 
        Get 
            Return _dueDate
        End Get 
        Set(ByVal value As Date)
            _dueDate = value
            _parent.UpdateList(Me)
            _parent.CheckForErrors()
        End Set 
    End Property
    
    public class ToDoItem
    {
        private string _name;
        [Description("Name of the To-Do item")]
        [Category("To-Do Fields")]
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                _parent.UpdateList(this);
            }
        }
    
        private DateTime _dueDate;
        [Description("Due date of the To-Do item")]
        [Category("To-Do Fields")]
        public DateTime DueDate
        {
            get { return _dueDate; }
            set
            {
                _dueDate = value;
                _parent.UpdateList(this);
                _parent.CheckForErrors();
            }
        }
    }
    

    Обратите внимание, что этот код имеет значение 2 свойства, имя и DueDate. Эти свойства отображаются в 2 Свойства окна, как показано на предыдущем рисунке. Каждое свойство предшествует атрибутами описания и категории, которые предоставляют сведения для отображения в Свойства окна. Исследуйте эти 2 для свойства name атрибута; строки должны соответствовать одному в изображении.

  5. Добавьте следующую функцию конструктора в верхней части класса.

    Private _parent As MyControl
    Public Sub New(ByVal parent As MyControl, ByVal name As String)
        _parent = parent
        _name = name
        _dueDate = Date.Now
    
        Dim daysAhead As Double = 0
        Dim package As IVsPackage = TryCast(_parent._parent.Package, IVsPackage)
        If package IsNot Nothing Then 
            Dim obj As Object
            package.GetAutomationObject("To-Do.General", obj)
    
            Dim options As ToolsOptions = TryCast(obj, ToolsOptions)
            If options IsNot Nothing Then
                daysAhead = options.DaysAhead
            End If 
        End If
    
        _dueDate = _dueDate.AddDays(daysAhead)
    End Sub
    
    private MyControl _parent;
    public ToDoItem(MyControl parent, string name)
    {
        _parent = parent;
        _name = name;
        _dueDate = DateTime.Now;
    
        double daysAhead = 0;
        IVsPackage package = _parent._parent.Package as IVsPackage;
        if (package != null)
        {
            object obj;
            package.GetAutomationObject("To-Do.General", out obj);
    
            ToolsOptions options = obj as ToolsOptions;
            if (options != null)
            {
                daysAhead = options.DaysAhead;
            }
        }
    
        _dueDate = _dueDate.AddDays(daysAhead);
    }
    

    Во-первых, этот код объявляет закрытый член с именем _parent, который соответствует пользовательский элемент управления, содержащий управления TextBox, кнопки и ListBox, созданного ранее. Конструктор принимает пользовательский элемент управления, как параметр вместе с строкой, имя для данного элемента ToDo. Первые 3 линии в конструкторе сохраняют пользовательский элемент управления, имя и текущую дату и время.

    Можно использовать текущую дату и время в качестве основы для включения параметр DaysAhead на странице параметров, созданную ранее. Так как текущая дата и время, обычно не используются как дата выполнения, можно переместить текущую дату числом дней, которые определены на странице Параметры. .

    Код объявляет локальную переменную, называемую daysAhead то устанавливаются с помощью значений в параметре DaysAhead. Следующая линия возвращает родительский объект для пользовательского элемента управления, а оттуда участник пакета. (Здесь используется _parent элемента, добавленного к классу MyControl.xaml.cs выше.)

    Если этот член пакета не равно null, то объявлен объект, который будет сохранять экземпляр ToolsOptions. Чтобы получить экземпляр, код вызывает элемент GetAutomationObject пакета и передает имя категории и подкатегории в виде единой многоточи-размежеванная строка, To-Do.General. Результаты передаются как параметр вывода обратно в переменную obj.

    Переменная obj затем привоженна к классу ToolsOptions и сохраняется в переменной options. Если эта переменная не равна нулю, то код возвращает DaysAhead элемент и сохраняет его в _daysAhead переменную.

    Затем код переводит _duedate переменная числом дней вперед с помощью AddDays метод.

  6. Так как экземпляры ToDoItem класс будет храниться в элемент управления ListBox и вызывать ListBox ToString функция, что этот класс наследуется из базового Object класс для получения строка, отображаемая для элемента следует перегружать ToString функция.

    Добавьте следующий код в ToDoItem.cs после конструктора и до конца класса.

    Public Overloads Overrides Function ToString() As String 
        Return (_name & " Due: ") + _dueDate.ToShortDateString()
    End Function
    
    public override string ToString()
    {
        return _name + " Due: " + _dueDate.ToShortDateString();
    }
    
  7. Откройте MyControl.xaml.cs или MyControl.xaml.vb.

  8. Добавьте методы в класс заглушки для MyControl CheckForError и UpdateList методы. Поместите их после ProcessDialogChar и до конца файла.

    Public Sub CheckForErrors()
    
    End Sub 
    
    Public Sub UpdateList(ByVal item As ToDoItem)
    
    End Sub
    Public Sub CheckForErrors()
    
    End Sub 
    
    Public Sub UpdateList(ByVal item As ToDoItem)
    
    End Sub
    
    public void CheckForErrors()
    {
    }
    public void UpdateList(ToDoItem item)
    {
    }
    

    CheckForError метод вызовет метод, имеющих одно и то же имя в родительском объекте, и метод проверяет, было ли какие-либо ошибки и обработки они правильно. UpdateList метод обновляет ListBox в родительском элементе управления; при вызове метод Name и DueDate свойства в этом изменении класса. Необходимо будет реализовать эти методы в последующем шаге.

Интеграция в окне свойств

Теперь напишите код, который управляет ListBox, которое будет связано с Свойства окна.

Необходимо добавить дескриптор к кнопке, которая считывает текстовое поле, создает экземпляр ToDoItem и добавляет экземпляр с ListBox.

Интеграция с окном свойств

  1. Переключитесь в представление конструирования MyControl.xaml, а затем дважды щелкните элемент управления " Кнопка "

  2. Замените существовать button1_Click функция обработчика с помощью следующего кода.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        If TextBox1.Text.Length > 0 Then 
            Dim item = New ToDoItem(Me, TextBox1.Text)
            ListBox1.Items.Add(item)
            TrackSelection()
            CheckForErrors()
        End If 
    End Sub
    
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1300:SpecifyMessageBoxOptions")]
    private void button1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text.Length > 0)
        {
            var item = new ToDoItem(this, textBox1.Text);
            listBox1.Items.Add(item);
            TrackSelection();
            CheckForErrors();
        }
    }
    

    Этот код создает новый экземпляр ToDoItem и передает экземпляр пользовательского элемента управления в качестве параметра вместе с текстом, пользователь вошел в систему управления TextBox. Затем код добавляет элемент в элемент управления ListBox. (Без доставки ListBox метод ToString экземпляра ToDoItem для получения строки для отображения в элемент управления ListBox.) Затем код вызывает функцию TrackSelection, записанный в последующем шаге. Наконец, код проверяет наличие ошибок.

  3. Переключитесь в представление конструирования MyControl.xaml, чтобы добавить код, то выделение дескрипторов пользователем нового элемента в элемент управления ListBox.

  4. Щелкните элемент управления ListBox. в Свойства дважды щелкните событие SelectionChanged окно. Делая это добавит заглушки для обработчика SelectionChanged и присвоить его к событию.

  5. Заполните обработчик SelectionChanged следующим образом, и он вызывает заглушки метода.

    Private Sub ListBox1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged
        TrackSelection()
    End Sub 
    
    Private Sub TrackSelection()
    
    End Sub
    
    private void listBox1_SelectionChanged(object sender, EventArgs e)
    {
        TrackSelection();
    }
    private void TrackSelection()
    {
    }
    
  6. Сохраните результаты работы. Можно построить проект и поиска typos.

  7. Теперь заполните функцию, которая предусмотрит интеграцию с TrackSelection Свойства окна. Эта функция вызывается, когда пользователь добавляет элемент в элемент управления ListBox или щелкает элемент в элемент управления ListBox.

    Теперь, когда имеется класс, Свойства окно может использовать можно интегрировать Свойства окно с окном инструментов. Когда пользователь щелкает элемент в элемент управления ListBox в окне инструментов Свойства окно должно быть обновлено соответственно. Аналогично, если пользователь изменяет элемент ToDo в Свойства окна, связанный элемент должно быть обновлено.

    Примечание

    В качестве альтернативы можно создавать PropertyChanged события непосредственно путем реализации INotifyPropertyChanged интерфейс.

    Поместите код для обновления Свойства окно в функции TrackSelection. Это ссылки на объект ToDoItem Свойства окно; не требуется писать дополнительный код для изменения ToDoItem, когда пользователь изменяет значение Свойства окна. Свойства окно автоматически вызывает set методы доступа к свойству для обновления значений. Однако следует выполнить метод UpdateList, созданный при написан код для класса ToDoItem.

  8. Добавьте следующие объявления пространства имен в начало файла MyControl.xaml.cs или MyControl.vb после существовать с помощью/выписки записей.

    Imports System
    Imports System.Runtime.InteropServices
    Imports Microsoft.VisualStudio.Shell.Interop
    Imports Microsoft.VisualStudio
    Imports Microsoft.VisualStudio.Shell
    
    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio.Shell.Interop;
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    
  9. Реализуйте функцию TrackSelection следующим образом.

    Private mySelContainer As SelectionContainer
    Private mySelItems As System.Collections.ArrayList
    Private frame As IVsWindowFrame = Nothing 
    Private Sub TrackSelection()
        If frame Is Nothing Then 
            Dim shell = TryCast(GetService(GetType(SVsUIShell)), IVsUIShell)
            If shell IsNot Nothing Then 
                Dim guidPropertyBrowser = New Guid(ToolWindowGuids.PropertyBrowser)
                shell.FindToolWindow(CUInt(__VSFINDTOOLWIN.FTW_fForceCreate), guidPropertyBrowser, frame)
            End If 
        End If 
        If frame IsNot Nothing Then
            frame.Show()
        End If 
        If mySelContainer Is Nothing Then
            mySelContainer = New SelectionContainer()
        End If
    
        mySelItems = New System.Collections.ArrayList()
    
        Dim selected = TryCast(listBox1.SelectedItem, ToDoItem)
        If selected IsNot Nothing Then
            mySelItems.Add(selected)
        End If
    
        mySelContainer.SelectedObjects = mySelItems
    
        Dim track = TryCast(GetService(GetType(STrackSelection)), ITrackSelection)
        If track IsNot Nothing Then
            track.OnSelectChange(mySelContainer)
        End If 
    End Sub
    
    private SelectionContainer mySelContainer;
    private System.Collections.ArrayList mySelItems;
    private IVsWindowFrame frame = null;
    
    private void TrackSelection()
    {
        if (frame == null)
        {
            var shell = GetService(typeof(SVsUIShell)) as IVsUIShell;
            if (shell != null)
            {
                var guidPropertyBrowser = new
                    Guid(ToolWindowGuids.PropertyBrowser);
                shell.FindToolWindow((uint)__VSFINDTOOLWIN.FTW_fForceCreate,
                    ref guidPropertyBrowser, out frame);
            }
        }
        if (frame != null)
        {
            frame.Show();
        }
        if (mySelContainer == null)
        {
            mySelContainer = new SelectionContainer();
        }
    
        mySelItems = new System.Collections.ArrayList();
    
        var selected = listBox1.SelectedItem as ToDoItem;
        if (selected != null)
        {
            mySelItems.Add(selected);
        }
    
        mySelContainer.SelectedObjects = mySelItems;
    
        var track = GetService(typeof(STrackSelection))
            as ITrackSelection;
        if (track != null)
        {
            track.OnSelectChange(mySelContainer);
        }
    }        
    
  10. Добавьте следующий код сразу после конца функции TrackSelection.

    Protected Function GetService(ByVal service As Type) As Object 
        Dim obj As Object = Nothing 
        If _parent IsNot Nothing Then
            obj = _parent.GetVsService(service)
        End If 
        Return obj
    End Function
    
    protected object GetService(Type service)
    {
        if (_parent != null)
        {
            return _parent.GetVsService(service);
        }
        return null;
    }
    

    Этот код вызывает функции GetService. Эта функция сначала пытается получить службу из родительского окна инструментов, вызвав его функции GetService. Если происходит сбой, то она пытается получить его из функции GetService объекта. Поскольку функция GetService в родительском окне инструментов не является открытой, код вызывает GetVsService. Необходимо добавить функцию GetVsService.

  11. Откройте MyToolWindow.cs или MyToolWindow.vb. Добавьте следующий код в конец класса, только до конца файла.

    Friend Function GetVsService(ByVal service As Type) As Object 
        Return GetService(service)
    End Function
    
    internal object GetVsService(Type service)
    {
        return GetService(service);
    }
    
  12. Сохраните файл.

    При первом запуске, она вызывает функцию TrackSelection GetService для получения экземпляра Visual Studio оболочка. Затем использует этот экземпляр для получения объекта, Свойства окна. Доступ Свойства объект окна запуске кода с помощью идентификатора GUID, представляющее Свойства окна. (GUID для окна инструментов элементы ToolWindowGuids80 класс.) Затем код вызывает функцию FindToolWindow оболочки, путем передачи идентификаторов GUID, чтобы получить Свойства объект окна. Делая это сохраняет его в переменной фрейма, чтобы при функция будет вызвана снова этот процесс получения Свойства окно не должно быть повторенно.

    Затем метод вызывает метод показа переменной фрейма для отображения Свойства окна.

    В следующем коде собирает выбранные элементы в ListBox. ListBox не настроен для включения выбор нескольких элементов. Передача выбранный элемент в Свойства окно, необходимо использовать контейнер. Поэтому код собирает выбранный элемент и помещает его в ArrayList, а затем помещает то ArrayList в контейнер типа SelectionContainer.

    Затем код вызывает GetService для получения экземпляра ITrackSelection, Visual Studio объект, который отслеживает выбранные объекты в пользовательском интерфейсе (ui) и отображает их свойства. Затем код прямо вызывает обработчик событий ITrackSelection OnSelectChange, и передает SelectionContainer, содержащий выбранный элемент. В результате Свойства окне отображаются свойства выбранного элемента.

    Если пользователь изменяет объект в ToDoItem Свойства окна Свойства окно автоматически вызывает set функции метода доступа в объекте ToDoItem. Были обновляет объект, но все равно следует обновить ListBox.

  13. В предыдущем шаге, добавленных в коде set функции метода доступа для вызова функции UpdateList в MyControl.xaml.cs или MyControl.xaml.vb. Теперь добавьте остальную часть кода функции UpdateList.

  14. Из MyControl.xaml.cs или MyControl.xaml.vb реализуйте метод UpdateList следующим образом.

    Public Sub UpdateList(ByVal item As ToDoItem)
        Dim index As Integer = ListBox1.SelectedIndex
        listBox1.Items.RemoveAt(index)
        listBox1.Items.Insert(index, item)
        ListBox1.SelectedItem = index
    End Sub
    
    public void UpdateList(ToDoItem item)
    {
        var index = listBox1.SelectedIndex;
        listBox1.Items.RemoveAt(index);
        listBox1.Items.Insert(index, item);
        listBox1.SelectedItem = index;
    }
    

    Этот код определяет, какой элемент выбран и будет соответствовать ToDoItem, которое изменяется. Код удаляет элемент из ListBox, а затем re-вставки его. Делая это обновляет линию в элемент управления ListBox для элемента. Затем код устанавливает выделение назад к одному элементу.

  15. Сохраните результаты работы.

Добавление текста в окне выходные данные и элементы в список задач

Добавление строки к Список задач и Вывод окно, сначала необходимо получить объекты, которые ссылаются на эти 2 окна. После этого можно вызывать методы для объектов. Для Список задачсоздается новый объект задачи типа, а затем добавить задачи на этот объект Список задач добавьте путем вызова его метода. Запись Вывод окно, следует вызвать метод GetPane, чтобы получить объект панели, а затем вызовите метод OutputString объекта области.

Добавление текста в окно вывод и список задач

  1. Откройте MyControl.xaml.cs или MyControl.xaml.vb.

  2. Разверните метод button1_Click, введя следующий код перед вызовом TrackSelection().

    Dim outputWindow = TryCast(GetService(GetType(SVsOutputWindow)), IVsOutputWindow)
    Dim pane As IVsOutputWindowPane
    Dim guidGeneralPane As Guid = VSConstants.GUID_OutWindowGeneralPane
    outputWindow.GetPane(guidGeneralPane, pane)
    If pane IsNot Nothing Then
        pane.OutputString(String.Format("To Do item created: {0} \r\n", item.ToString()))
    End If
    
    private void button1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text.Length > 0)
        {
            var item = new ToDoItem(this, textBox1.Text);
            listBox1.Items.Add(item);
    
            //Insert this section------------------ 
            var outputWindow = GetService(
                typeof(SVsOutputWindow)) as IVsOutputWindow;
            IVsOutputWindowPane pane;
            Guid guidGeneralPane =
                VSConstants.GUID_OutWindowGeneralPane;
            outputWindow.GetPane(ref guidGeneralPane, out pane);
            if (pane != null)
            {
                pane.OutputString(string.Format(
                    "To Do item created: {0}\r\n",
                    item.ToString()));
            }
            //-------------------------------------
    
            TrackSelection();
            CheckForErrors();
        }
    

    Этот код получает объект Вывод окна. Объект предоставляет интерфейс IVsOutputWindow. Затем код возвращает объект IVsOutputWindowPane, который включает функцию OutputString, в конечном счете, в который записывает Вывод окна.

  3. Теперь реализуйте метод CheckForErrors следующим образом.

    Public Sub CheckForErrors()
        For Each item As ToDoItem In ListBox1.Items
            If item.DueDate < DateTime.Now Then
                ReportError("To Do Item is out of date: " & item.ToString())
            End If 
        Next 
    End Sub
    
    public void CheckForErrors()
    {
        foreach (ToDoItem item in listBox1.Items)
        {
            if (item.DueDate < DateTime.Now)
            {
                ReportError("To Do Item is out of date: "
                    + item.ToString());
            }
        }
    }
    

    Этот код вызывает метод ReportError, которое создается далее вместе с некоторыми другими методами, которые позволяют добавлять элементы Список задач.

  4. Добавьте следующий код в конец класса, но до 2 заключительными фигурными скобками.

    <Guid("72de1eAD-a00c-4f57-bff7-57edb162d0be")> _
    Public Class MyTaskProvider
        Inherits TaskProvider
        Public Sub New(ByVal sp As IServiceProvider)
            MyBase.New(sp)
        End Sub 
    End Class 
    Private _taskProvider As MyTaskProvider
    Private Sub CreateProvider()
        If _taskProvider Is Nothing Then
            _taskProvider = New MyTaskProvider(_parent)
            _taskProvider.ProviderName = "To Do" 
        End If 
    End Sub 
    Private Sub ClearError()
        CreateProvider()
        _taskProvider.Tasks.Clear()
    End Sub 
    Private Sub ReportError(ByVal p As String)
        CreateProvider()
        Dim errorTask = New Task()
        errorTask.CanDelete = False
        errorTask.Category = TaskCategory.Misc
        errorTask.Text = p
    
        _taskProvider.Tasks.Add(errorTask)
    
        _taskProvider.Show()
    
        Dim taskList = TryCast(GetService(GetType(SVsTaskList)), IVsTaskList2)
        If taskList Is Nothing Then 
            Exit Sub 
        End If 
    
        Dim guidProvider = GetType(MyTaskProvider).GUID
        taskList.SetActiveProvider(guidProvider)
    End Sub
    
    [Guid("72de1eAD-a00c-4f57-bff7-57edb162d0be")]
    public class MyTaskProvider : TaskProvider
    {
        public MyTaskProvider(IServiceProvider sp)
            : base(sp)
        {
        }
    }
    private MyTaskProvider _taskProvider;
    private void CreateProvider()
    {
        if (_taskProvider == null)
        {
            _taskProvider = new MyTaskProvider(_parent);
            _taskProvider.ProviderName = "To Do";
        }
    }
    private void ClearError()
    {
        CreateProvider();
        _taskProvider.Tasks.Clear();
    }
    private void ReportError(string p)
    {
        CreateProvider();
        var errorTask = new Task();
        errorTask.CanDelete = false;
        errorTask.Category = TaskCategory.Misc;
        errorTask.Text = p;
    
        _taskProvider.Tasks.Add(errorTask);
    
        _taskProvider.Show();
    
        var taskList = GetService(typeof(SVsTaskList))
            as IVsTaskList2;
        if (taskList == null)
        {
            return;
        }
    
        var guidProvider = typeof(MyTaskProvider).GUID;
        taskList.SetActiveProvider(ref guidProvider);
    }
    

    В начале этого кода MyTaskProvider специализированное TaskProvider класса с именем, которое включает идентификатор GUID. Теперь переменная члена этого типа нового класса, за методом, который создает новый экземпляр при необходимости.

    Затем получаются 2 важные методы, ClearError, который очищает существующих элементов задачи и ReportError, которое добавляет элементы к Список задач.

    Метод ReportError создает новый экземпляр задачи, инициализирует экземпляр, а затем добавляет экземпляр с Список задач. Создать Список задач записи доступны только когда пользователь выбирает элемент в раскрывающемся списке в верхней части ToDo Список задач. Конечный 2 линии в коде автоматически выбирают элемент ToDo в раскрывающемся списке и приносят новые элементы задач в представлении. Идентификатор GUID не требуется, если класс наследуется TaskProvider поскольку метод SetActiveProvider требует GUID в качестве параметра.

Попытка его out

Тестирование расширения

  1. Нажмите сочетание клавиш CTRL+F5, чтобы открыть экспериментальном построении Visual Studio.

  2. В экспериментальном построении на Сервис меню выберите команду диспетчер Todo.

    Окно инструментов, созданной должно открыть.

  3. Введите текст в текстовое поле и нажмите кнопку Добавить.

    Вы должны увидеть, что элемент добавляется в элемент управления ListBox.

  4. Тип что-либо еще, а затем нажмите кнопку Добавить опять-таки.

    При добавлении элементов, начальная дата устанавливается в текущую дату и время. Это ошибка также активировать и запись Список задач.

  5. На Просмотреть меню выберите команду Вывод открыть Вывод окна.

    Обратите внимание, что каждый раз при добавлении элемент отображается сообщение в Список задач панель.

  6. Щелкните один из элементов ListBox.

    Свойства окно отображает 2 свойств для элемента.

  7. Изменить одно из его свойств, а затем нажмите клавишу ВВОД.

    Элемент обновляется в ListBox.

Что дальше?

В этом пошаговом руководстве вы создали окно инструментов, интегрированное с другим окном инструментов in Visual Studio. Visual Studio имеется несколько окон элементов, с которыми можно работать с идентификатором GUID, и для них можно найти в ToolWindowGuids класс. Также будет создан класс, содержащий свойства, Свойства окно может получить доступ. Функции метода доступа, предоставляемые будет Свойства окно используется. в set функции метода доступа, вызвавших в собственный код для обработки изменений, внесенных в Свойства окна. Это обеспечивает механизм двусторонней связи. Наконец, можно выучили добавлении элементов в Список задачкак отобразить элементы в представлении, и добавление текста к Вывод окна.

См. также

Основные понятия

Окно вывода (Visual Studio)

список задач

Другие ресурсы

Команды, меню, панели инструментов

окна инструментов

окно свойств и страницы свойств