Пошаговое руководство: элементы панели элементов автозагрузки
В этом пошаговом руководстве показано, как управляемое VSPackage может использовать отражение, чтобы автоматически загружать все ToolboxItem элементы, предоставляемые своей собственной сборкой.
Примечание
Рекомендуемый способ добавлять пользовательские элементы управления в панели элементов использовать шаблоны элементов управления панели элементов, поступающие в пакет SDK Visual Studio 10, включая поддержку автоматическ-загрузки.В этом разделе сведения о том, сохраняется для обеспечения обратной совместимости, для добавления существующих элементов управления в панель элементов и дополнительно разработки для панели элементов.
Дополнительные сведения о создании управления панели элементов с помощью шаблонов см. в разделе Практическое руководство. Создание элемента управления панели элементов является использования Windows Forms и Практическое руководство. Создание элемента управления панели элементов является использования WPF.
В этом пошаговом руководстве помогает выполнить следующие этапы.
Добавление и правильно зарегистрируйте все Панель элементов элементы управления в объектах с помощью VSPackage ToolboxItemAttribute" ToolboxBitmapAttributeи DisplayNameAttribute.
Создайте следующие 2 элемента управления, и добавьте значки для каждого к Панель элементов.
Добавьте один элемент управления, с помощью значения по умолчанию ToolboxItem класс.
Добавьте другой элемент управления с помощью пользовательского класса, производного от ToolboxItem класс.
Зарегистрируйте VSPackage, как обеспечение безопасности ToolboxItem объекты, имеющие ProvideToolboxItemsAttribute класс.
Использование отражения для получения списка всех ToolboxItem объекты, которые VSPackage предоставляет при его загрузке.
Создание обработчика ToolboxInitialized и ToolboxUpgraded события. Это гарантирует, что ToolboxItem объекты VSPackage правильно загружены.
Реализация команды выполнить реинициализацию в VSPackage Панель элементов.
Обязательные компоненты
Чтобы выполнить это пошаговое руководство, необходимо устанавливать SDK для Visual Studio 2010.
Примечание
Дополнительные сведения о пакете SDK для Visual Studio см. в разделе интеграция SDK Visual Studio.Чтобы узнать, как загрузить пакет SDK для Visual Studio см. в разделе Центр разработчиков расширяемости Visual Studio на веб-сайте MSDN.
Расположения для шаблона проекта пакета Visual Studio
Шаблон проекта пакета Visual Studio могут находиться в разных местах в 3 Создать проект диалоговое окно:
Под моделью расширяемости Visual Basic. Язык по умолчанию для проекта Visual Basic.
Под расширяемостью c#. Язык по умолчанию для проекта c#.
Под другой моделью расширяемости типов проектов. Язык по умолчанию для проекта C++.
Создать управляемое VSPackage
Создание LoadToolboxMembers VSPackage
Создайте VSPackage " LoadToolboxMembers. Дополнительные сведения см. в разделе Пошаговое руководство: Создание команды меню ресурсов с помощью шаблона пакета Visual Studio.
Добавьте команду меню.
Назовите команды Инициализация LoadToolboxMembers VB для Visual Basic или Инициализация CS LoadToolboxMembers для Visual c#.
Если следовать этому пошаговому руководству для нескольких языков, необходимо обновить проект неоднозначности созданные сборки.
Неоднозначности Visual Basic и Visual c# VSPackages
Для Visual Basic.
В обозревателе решений откройте свойства проекта и выберите Приложение вкладка.
Измените имя сборки LoadToolboxMembersVBи измените пространство имен по умолчанию Company.LoadToolboxMembersVB.
Для Visual C#.
В обозревателе решений откройте свойства проекта и выберите Приложение вкладка.
Измените имя сборки LoadToolboxMembersCSи измените пространство имен по умолчанию Company.LoadToolboxMembersCS.
Открытие класс LoadToolboxMembersPackage в редакторе кода.
Использование средств рефакторинга для переименования существующее пространство имен, щелкните правой кнопкой мыши существующее имя пространства имен LoadToolboxMembersвыберите Рефакторинг, а затем нажмите кнопку Переименовать. Измените имя на LoadToolboxMembersCS.
Сохраните все изменения.
Добавление поддержки ссылки
В проекте добавьте ссылку на LoadToolboxMembers System.Drawing.Design компонент платформы .NET Framework, как показано ниже.
IN Обозреватель решенийщелкните правой кнопкой мыши проект и выберите пункт LoadToolboxMembers Добавление ссылки.
На .NET вкладка Добавление ссылок диалоговое окно " дважды щелкает System.Drawing.Design.
Для Visual Basic добавьте следующие пространства имен в списке импортирована пространствам имен в проекте.
Company.LoadToolboxMembersVB
Система
System.ComponentModel
System.Drawing
System.Windows.Forms
Тестирование созданный код
Компилирование и запустите VSPackage в кусте Visual Studio экспериментальном.
На Сервис меню выберите команду Инициализация LoadToolboxMembers VB OR Инициализация CS LoadToolboxMembers.
Это открывает окно сообщения, содержащее текст в том, что пакет был вызван обработчик пункта меню.
Закройте экспериментальном версия Visual Studio.
Создание элемента управления панели элементов
В этом разделе, можно создать и зарегистрировать пользовательский элемент управления Control1объявляет, то связанное с ним значение по умолчанию Панель элементов элемент. Дополнительные сведения о том, как к элементам управления и формы windows forms автора ToolboxItem класс, cм. Создание элементов управления Windows Forms во время разработки.
Для создания области элементов элемент управления, которая будет использоваться по умолчанию ToolboxItem
IN Обозреватель решенийдобавьте a UserControl объект к проекту LoadToolboxMembers следующим образом:
IN Обозреватель решенийщелкните правой кнопкой мыши LoadToolboxMembers выберите проект Добавить, а затем нажмите кнопку Пользовательский элемент управления.
в Добавление нового элемента диалогового окна, измените имя на Control1.vb для Visual Basic OR Control1.cs для Visual C#.
Дополнительные сведения о том, как добавлять новые элементы к проекту см. в разделе Как Добавление новых элементов проекта.
Новые открытые элемента управления в представлении конструирования.
От Панель элементовперетащите a кнопка мониторинг (найден в Стандартные элементы управления категория) в конструктор.
Дважды щелкните элемент button созданную. Это создает обработчик событий для кнопки Click событие. Обновление обработчика событий с помощью следующего кода:
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles Button1.Click MessageBox.Show("Hello world from " & Me.ToString()) End Sub
private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello world from " + this.ToString()); }
Измените конструктор элемента управления, чтобы задать текст кнопки после InitializeComponent метод вызывается:
Public Sub New() InitializeComponent() Button1.Text = Me.Name + " Button" End Sub
public Control1() { InitializeComponent(); button1.Text = this.Name + " Button"; }
Добавьте атрибуты к файлу для разрешения VSPackage, чтобы запросить предоставленное ToolboxItem класс.
' Set the display name and custom bitmap to use for this item. ' The build action for the bitmap must be "Embedded Resource". <DisplayName("ToolboxMember 1 VB")> _ <Description("Custom toolbox item from package LoadToolboxMembers.")> _ <ToolboxItem(True)> _ <ToolboxBitmap(GetType(Control1), "Control1.bmp")> _ Public Class Control1
// Set the display name and custom bitmap to use for this item. // The build action for the bitmap must be "Embedded Resource". [DisplayName("ToolboxMember 1 CS")] [Description("Custom toolbox item from package LoadToolboxMembers.")] [ToolboxItem(true)] [ToolboxBitmap(typeof(Control1), "Control1.bmp")] public partial class Control1 : UserControl {
Сохраните файл.
В следующей процедуре предстоит создать и зарегистрировать пользовательский элемент управления, второй Control2пользовательская, а связанная Панель элементов элемент Control2_ToolboxItem, то выводится из ToolboxItem класс.
Для создания элемента управления панели элементов для использования класса ToolboxItem-выведенного задачи
Создайте второй с именем пользовательского элемента управления Control2. Сдвоенный щелкните форму, чтобы вывести файл кода.
Добавить System.Drawing.Design и System.Globalization на пространства имен, используемые в классе.
Imports System.Drawing.Design Imports System.Globalization
using System.Drawing.Design; using System.Globalization;
Добавьте обработчик событий кнопки и нажатия кнопки и обновите конструктор элемента управления как можно обновить первый элемент управления.
Добавление DisplayNameAttribute" DescriptionAttribute" ToolboxItemAttributeи ToolboxBitmapAttribute атрибуты к файлу.
Эти атрибуты позволяют VSPackage, чтобы запросить a ToolboxItem класс.
Дополнительные сведения и примеры о том, как создавать пользовательский ToolboxItem объекты, см. обсуждение в ToolboxItem страница ссылки.
Вместе с предыдущими изменениями, второй класс элемента управления должен выглядеть следующим образом. Символ Control2_ToolboxMenu не будут не определены до следующего шага.
' Set the display name and custom bitmap to use for Me item. ' The build action for the bitmap must be "Embedded Resource". ' Also declare a custom toolbox item implementation. <DisplayName("ToolboxMember 2 VB")> _ <Description("Custom toolbox item from package LoadToolboxMembers.")> _ <ToolboxItem(GetType(Control2_ToolboxItem))> _ <ToolboxBitmap(GetType(Control2), "Control2.bmp")> _ Public Class Control2 Public Sub New() InitializeComponent() Button1.Text = Me.Name + " Button" End Sub Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles Button1.Click MessageBox.Show("Hello world from " & Me.ToString()) End Sub End Class
// Set the display name and custom bitmap to use for this item. // The build action for the bitmap must be "Embedded Resource". // Also declare a custom toolbox item implementation. [DisplayName("ToolboxMember 2 CS")] [Description("Custom toolbox item from package LoadToolboxMembers.")] [ToolboxItem(typeof(Control2_ToolboxItem))] [ToolboxBitmap(typeof(Control2), "Control2.bmp")] public partial class Control2 : UserControl { public Control2() { InitializeComponent(); button1.Text = this.Name + " Button"; } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello world from " + this.ToString()); } }
Создайте класс Control2_ToolboxItem. This ToolboxItem создает для второго элемента управления и добавляется к Панель элементов. Класс должен иметь SerializableAttribute при применении к нему.
<Serializable()> _ Friend Class Control2_ToolboxItem Inherits ToolboxItem Public Sub New(ByVal toolType As Type) MyBase.New(toolType) End Sub Public Overrides Sub Initialize(ByVal toolType As Type) If Not toolType.Equals(GetType(Control2)) Then Throw New ArgumentException( _ String.Format(CultureInfo.CurrentCulture, _ "The {0} constructor argument must be of type {1}.", _ Me.GetType().FullName, GetType(Control2).FullName)) End If MyBase.Initialize(toolType) End Sub End Class
[Serializable()] internal class Control2_ToolboxItem : ToolboxItem { public Control2_ToolboxItem(Type toolType) : base(toolType) { } public override void Initialize(Type toolType) { if (!toolType.Equals(typeof(Control2))) { throw new ArgumentException( string.Format(CultureInfo.CurrentCulture, "The {0} constructor argument must be of type {1}.", this.GetType().FullName, typeof(Control2).FullName)); } base.Initialize(toolType); } }
Сохраните файл.
Внедренные значки растрового изображения
2 Экземпляра ToolboxBitmapAttribute используется более ранняя показать, что проект представляющий 2 элемента управления с помощью следующих значков:
Control1.bmp, находится в пространстве имен, который содержит первый элемент управления.
Control2.bmp, находится в пространстве имен, который содержит второй элемент управления.
Внедренные значки растрового изображения для ToolboxItem
Добавьте 2 новых растрового изображения в проекте следующим образом.
Щелкните правой кнопкой мыши LoadToolboxMembers этот проект.
Укажите Добавить, а затем нажмите кнопку Создать элемент.
в Добавление нового элемента диалоговое окно открывается Файл точечного рисункаи назовите файл Control1.bmp.
Повторяющиеся эти шаги для второго и назовите его растрового изображения Control2.bmp.
Это позволяет открыть каждое точечное изображение в Visual Studio редактор растрового изображения.
Задайте размер каждого значка в 16 x 16, следующим образом.
Для каждого растрового изображения нажмите кнопку Окно свойств на Просмотреть меню.
в Свойства окно, набор Высота и ширина до 16.
Используйте редактор растрового изображения в пределах Visual Studio создать образ для каждого значка.
IN Обозреватель решенийщелкните каждый файл растрового изображения, а затем в Свойства окно выберите Действие при построении свойство Внедренный ресурс.
Сохраните все файлы.
Изменив реализацию VSPackage
Реализация по умолчанию VSPackage, должны быть изменены, чтобы выполнить следующие действия:
Поддержка регистра для быть a Панель элементов поставщик элемента.
Получение списка ToolboxItem объекты, VSPackage поддерживает.
Загрузка ToolboxItem объект Visual Studio Панель элементов после ToolboxInitialized и ToolboxUpgraded события обрабатываются.
В следующей процедуре показано, как изменить реализацию пакета.
Изменить реализацию пакета, чтобы быть поставщиком элементов панели инструментов, в VSPackage
Откройте файл LoadToolboxMembersPackage.cs или LoadToolboxMembersPackage.vb в редакторе кода.
Измените объявление LoadToolboxMembersPackage класс, являющийся реализацией Package класс в решении следующим образом.
Добавьте следующие директивы пространства имен в LoadToolboxMembersPackage файл класса.
Imports System.Collections Imports System.ComponentModel Imports System.Drawing.Design Imports System.Reflection
using System.Collections; using System.ComponentModel; using System.Drawing.Design; using System.Reflection;
Зарегистрируйте VSPackage например, a ToolboxItem класс, добавляя экземпляр ProvideToolboxItemsAttribute.
Примечание
Единственный аргумент ProvideToolboxItemsAttribute версия ToolboxItem это обеспечивается VSPackage.Чтобы изменить это значение обеспечивает интегрированную среду разработки для загрузки VSPackage, даже если оно имеет более раннюю кэшированную версию ToolboxItem класс.
Добавьте следующие 2 новое private поля LoadToolboxMembersPackage класс.
ArrayList именованный элемент ToolboxItemListнажмите сохранить список ToolboxItem объекты LoadToolboxMembersPackage класс управляет.
A String, называется CategoryTab, содержащий Панель элементов категория или табуляции, которые используются для хранения ToolboxItem объекты, управляемых LoadToolboxMembersPackage класс.
Результатом этого изменений напоминает следующий код:
Imports Microsoft.VisualBasic Imports System Imports System.Diagnostics Imports System.Globalization Imports System.Runtime.InteropServices Imports System.ComponentModel.Design Imports Microsoft.Win32 Imports Microsoft.VisualStudio.Shell.Interop Imports Microsoft.VisualStudio.OLE.Interop Imports Microsoft.VisualStudio.Shell Imports System.Collections Imports System.ComponentModel Imports System.Drawing.Design Imports System.Reflection ' ... <PackageRegistration(UseManagedResourcesOnly:=True), _ DefaultRegistryRoot("Software\\Microsoft\\VisualStudio\\9.0"), _ InstalledProductRegistration(False, "#110", "#112", "1.0", IconResourceID:=400), _ ProvideLoadKey("Standard", "1.0", "Package Name", "Company", 1), _ ProvideMenuResource(1000, 1), _ Guid(GuidList.guidLoadToolboxMembersPkgString)> _ <ProvideToolboxItems(1)> _ Public NotInheritable Class LoadToolboxMembersPackage Inherits Package ' List for the toolbox items provided by this package. Private ToolboxItemList As ArrayList ' Name for the Toolbox category tab for the package's toolbox items. Private CategoryTab As String = "LoadToolboxMembers Walkthrough VB" ' ...
using System; using System.Diagnostics; using System.Globalization; using System.Runtime.InteropServices; using System.ComponentModel.Design; using Microsoft.Win32; using Microsoft.VisualStudio.Shell.Interop; using Microsoft.VisualStudio.OLE.Interop; using Microsoft.VisualStudio.Shell; using System.Collections; using System.ComponentModel; using System.Drawing.Design; using System.Reflection; namespace Company.LoadToolboxMembersCS { // ... [PackageRegistration(UseManagedResourcesOnly = true)] // ... [DefaultRegistryRoot("Software\\Microsoft\\VisualStudio\\9.0")] // ... [InstalledProductRegistration(false, "#110", "#112", "1.0", IconResourceID = 400)] // ... [ProvideLoadKey("Standard", "1.0", "Package Name", "Company", 1)] // ... [ProvideMenuResource(1000, 1)] [Guid(GuidList.guidLoadToolboxMembersPkgString)] [ProvideToolboxItems(1)] public sealed class LoadToolboxMembersPackage : Package { // List for the toolbox items provided by this package. private ArrayList ToolboxItemList; // Name for the Toolbox category tab for the package's toolbox items. private string CategoryTab = "LoadToolboxMembers Walkthrough CS"; // ...
Разверните область элементов пакета, чтобы изменить Initialize метод, чтобы выполнить следующие действия:
Для Visual C#, подписаться ToolboxInitialized и ToolboxUpgraded события.
Вызовите CreateItemList метод для заполнения ArrayList object ToolboxItemList. ToolboxItemList содержит список всех элементов панели инструментов, LoadToolboxMembersPackage управляет.
Protected Overrides Sub Initialize() Trace.WriteLine(String.Format(CultureInfo.CurrentCulture, _ "Entering Initialize() of: {0}", Me.GetType().Name)) MyBase.Initialize() ' Add our command handlers for menu (commands must exist in the .vsct file) Dim mcs As OleMenuCommandService = _ TryCast(GetService(GetType(IMenuCommandService)), OleMenuCommandService) If Not mcs Is Nothing Then ' Create the command for the menu item. Dim menuCommandID As New CommandID( _ GuidList.guidLoadToolboxMembersCmdSet, CInt(PkgCmdIDList.cmdidMyCommand)) Dim menuItem As New MenuCommand( _ New EventHandler(AddressOf MenuItemCallback), menuCommandID) mcs.AddCommand(menuItem) End If ' Use reflection to get the toolbox items provided in this assembly. ToolboxItemList = CreateItemList(Me.GetType().Assembly) If ToolboxItemList Is Nothing Then ' Unable to generate the list. ' Add error handling code here. End If End Sub
protected override void Initialize() { Trace.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 menu item. CommandID menuCommandID = new CommandID(GuidList.guidLoadToolboxMembersCmdSet, (int)PkgCmdIDList.cmdidMyCommand); MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID ); mcs.AddCommand( menuItem ); // Subscribe to the toolbox intitialized and upgraded events. ToolboxInitialized += new EventHandler(OnRefreshToolbox); ToolboxUpgraded += new EventHandler(OnRefreshToolbox); } // Use reflection to get the toolbox items provided in this assembly. ToolboxItemList = CreateItemList(this.GetType().Assembly); if (null == ToolboxItemList) { // Unable to generate the list. // Add error handling code here. } }
Добавление метода, 2 CreateItemList и CreateToolboxItem, построение с помощью метаданных экземпляров ToolboxItem объекты, доступные в LoadToolboxMembers сборка, следующим образом:
' Scan for toolbox items in the assembly and return the list of ' toolbox items. Private Function CreateItemList(ByVal asmbly As Assembly) As ArrayList Dim list As New ArrayList() For Each possibleItem As Type In asmbly.GetTypes() Dim item As ToolboxItem = CreateToolboxItem(possibleItem) If item IsNot Nothing Then list.Add(item) End If Next Return list End Function ' If the type represents a toolbox item, return an instance of the type ' otherwise, return Nothing. Private Function CreateToolboxItem(ByVal possibleItem As Type) As ToolboxItem ' A toolbox item must implement IComponent and must not be abstract. If Not GetType(IComponent).IsAssignableFrom(possibleItem) Or _ possibleItem.IsAbstract Then Return Nothing End If ' A toolbox item must have a constructor that takes a parameter of ' type Type or a constructor that takes no parameters. If possibleItem.GetConstructor(New Type() {GetType(Type)}) Is Nothing And _ possibleItem.GetConstructor(New Type() {}) Is Nothing Then Return Nothing End If Dim item As ToolboxItem = Nothing ' Check the custom attributes of the candidate type and attempt to ' create an instance of the toolbox item type. Dim attribs As AttributeCollection = _ TypeDescriptor.GetAttributes(possibleItem) Dim tba As ToolboxItemAttribute = TryCast( _ attribs(GetType(ToolboxItemAttribute)), ToolboxItemAttribute) If tba IsNot Nothing And Not tba.Equals(ToolboxItemAttribute.None) Then If Not tba.IsDefaultAttribute() Then ' This type represents a custom toolbox item implementation. Dim itemType As Type = tba.ToolboxItemType Dim ctor As ConstructorInfo = _ itemType.GetConstructor(New Type() {GetType(Type)}) If ctor IsNot Nothing And itemType IsNot Nothing Then item = CType(ctor.Invoke(New Object() {possibleItem}), ToolboxItem) Else ctor = itemType.GetConstructor(New Type() {}) If ctor IsNot Nothing Then item = CType(ctor.Invoke(New Object() {}), ToolboxItem) item.Initialize(possibleItem) End If End If Else ' This type represents a default toolbox item. item = New ToolboxItem(possibleItem) End If If item Is Nothing Then Throw New ApplicationException("Unable to create a ToolboxItem " & _ "object from " & possibleItem.FullName & ".") End If End If ' Update the display name of the toolbox item and add the item to ' the list. Dim displayName As DisplayNameAttribute = TryCast( _ attribs(GetType(DisplayNameAttribute)), DisplayNameAttribute) If displayName IsNot Nothing And Not displayName.IsDefaultAttribute() Then item.DisplayName = displayName.DisplayName End If Return item End Function
// Scan for toolbox items in the assembly and return the list of // toolbox items. private ArrayList CreateItemList(Assembly assembly) { ArrayList list = new ArrayList(); foreach (Type possibleItem in assembly.GetTypes()) { ToolboxItem item = CreateToolboxItem(possibleItem); if (item != null) { list.Add(item); } } return list; } // If the type represents a toolbox item, return an instance of the type; // otherwise, return null. private ToolboxItem CreateToolboxItem(Type possibleItem) { // A toolbox item must implement IComponent and must not be abstract. if (!typeof(IComponent).IsAssignableFrom(possibleItem) || possibleItem.IsAbstract) { return null; } // A toolbox item must have a constructor that takes a parameter of // type Type or a constructor that takes no parameters. if (null == possibleItem.GetConstructor(new Type[] { typeof(Type) }) && null == possibleItem.GetConstructor(new Type[0])) { return null; } ToolboxItem item = null; // Check the custom attributes of the candidate type and attempt to // create an instance of the toolbox item type. AttributeCollection attribs = TypeDescriptor.GetAttributes(possibleItem); ToolboxItemAttribute tba = attribs[typeof(ToolboxItemAttribute)] as ToolboxItemAttribute; if (tba != null && !tba.Equals(ToolboxItemAttribute.None)) { if (!tba.IsDefaultAttribute()) { // This type represents a custom toolbox item implementation. Type itemType = tba.ToolboxItemType; ConstructorInfo ctor = itemType.GetConstructor(new Type[] { typeof(Type) }); if (ctor != null && itemType != null) { item = (ToolboxItem)ctor.Invoke(new object[] { possibleItem }); } else { ctor = itemType.GetConstructor(new Type[0]); if (ctor != null) { item = (ToolboxItem)ctor.Invoke(new object[0]); item.Initialize(possibleItem); } } } else { // This type represents a default toolbox item. item = new ToolboxItem(possibleItem); } } if (item == null) { throw new ApplicationException("Unable to create a ToolboxItem " + "object from " + possibleItem.FullName + "."); } // Update the display name of the toolbox item and add the item to // the list. DisplayNameAttribute displayName = attribs[typeof(DisplayNameAttribute)] as DisplayNameAttribute; if (displayName != null && !displayName.IsDefaultAttribute()) { item.DisplayName = displayName.DisplayName; } return item; }
Реализуйте OnRefreshToolbox метод обработки ToolboxInitialized и ToolboxUpgraded события.
OnRefreshToolbox метод использует список ToolboxItem объекты, содержащиеся в ToolboxItemList элемент LoadToolboxMembersPackage класс. Он также вносит следующие действия:
Удаляет все ToolboxItem объекты, которые уже присутствует в категории области элементов, которая определяется переменной CategoryTab.
Добавляет новые экземпляры всех ToolboxItem объекты, которые перечисляются внутри ToolboxItemList на вкладке категории VSProject.
Устанавливает Панель элементов активную вкладку на вкладке категории VSProject.
Private Sub OnRefreshToolbox(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.ToolboxInitialized, Me.ToolboxUpgraded ' Add new instances of all ToolboxItems contained in ToolboxItemList. Dim service As IToolboxService = TryCast( _ GetService(GetType(IToolboxService)), IToolboxService) Dim toolbox As IVsToolbox = TryCast( _ GetService(GetType(IVsToolbox)), IVsToolbox) 'Remove target tab and all controls under it. For Each oldItem As ToolboxItem In service.GetToolboxItems(CategoryTab) service.RemoveToolboxItem(oldItem) Next toolbox.RemoveTab(CategoryTab) For Each itemFromList As ToolboxItem In ToolboxItemList service.AddToolboxItem(itemFromList, CategoryTab) Next service.SelectedCategory = CategoryTab service.Refresh() End Sub
void OnRefreshToolbox(object sender, EventArgs e) { // Add new instances of all ToolboxItems contained in ToolboxItemList. IToolboxService service = GetService(typeof(IToolboxService)) as IToolboxService; IVsToolbox toolbox = GetService(typeof(IVsToolbox)) as IVsToolbox; //Remove target tab and all controls under it. foreach (ToolboxItem oldItem in service.GetToolboxItems(CategoryTab)) { service.RemoveToolboxItem(oldItem); } toolbox.RemoveTab(CategoryTab); foreach (ToolboxItem itemFromList in ToolboxItemList) { service.AddToolboxItem(itemFromList, CategoryTab); } service.SelectedCategory = CategoryTab; service.Refresh(); }
Примечание
В качестве упражнения, одно может начинаться механизм для тестирования версия VSPackage или элементов и обновляет только если версия изменилась ли версия или VSPackage ToolboxItem изменяется.
Инициализация toolbox
Реализация команды инициализации панели элементов
Измените метод обработчика команды пункта меню MenuItemCallBackследующим образом.
Заменить существующую реализация MenuItemCallBack следующим кодом:
Private Sub MenuItemCallback(ByVal sender As Object, ByVal e As EventArgs) Dim pkg As IVsPackage = TryCast(GetService(GetType(Package)), Package) pkg.ResetDefaults(CUInt(__VSPKGRESETFLAGS.PKGRF_TOOLBOXITEMS)) End Sub
private void MenuItemCallback(object sender, EventArgs e) { IVsPackage pkg = GetService(typeof(Package)) as Package; pkg.ResetDefaults((uint)__VSPKGRESETFLAGS.PKGRF_TOOLBOXITEMS); }
Построение и запуск решения
Можно работать продукт этого пошагового руководства с помощью экземпляра Visual Studio, выполняемое в экспериментальном кусте.
Для работы этого пошагового руководства
В Visual Studio Построение меню выберите команду Перестроить решение.
Нажмите клавишу F5, чтобы запустить второй экземпляр Visual Studio в экспериментальном кусте реестра.
Дополнительные сведения об использовании экспериментальном кусту см. в разделе экспериментальный экземпляр Visual Studio.
Выберите меню Сервис.
Именованная команда Инициализация LoadToolboxMembers VB OR Инициализация CS LoadToolboxMembers отображаться в верхней части меню вместе с значком, который имеет числительное 1.
Создание новой Visual C# OR Visual Basic приложение Windows Forms.
A Form- на основе конструктор должен присутствовать.
Перетащите одно или оба новых элементов управления Пошаговое руководство LoadToolboxMembers VB OR CS пошагового руководства LoadToolboxMembers категория Панель элементов на форму в конструкторе.
Примечание
Если Панель элементов указывает, нажмите кнопку Панель элементов на Просмотреть меню.Если вкладка не отображается в категории VSPackage Панель элементов, re-инициализируйте Панель элементов щелкнув Инициализация LoadToolboxMembers VB OR Инициализация CS LoadToolboxMembers на Сервис меню.
Постройте приложение windows, щелкнув Перестроить решение на Построение меню.
Запустите приложение, щелкнув то Запуск OR Начните с отладкой на Отладка меню.
При выполнении приложения щелкните один из элементов управления, которые были добавлены к приложению.
Окно сообщения, в котором отображается, "Hello world from Company.LoadToolboxMembers.Control1" OR"Hello world from Company.LoadToolboxMembers.Control2".
Анализ реализации
Создание элемента управления панели элементов
Атрибуты, присвоенные Control1 и Control2 воспользуйтесь методом CreateItemList если запросы Assembly для доступного Панель элементов элементы управления.
ToolboxItemAttribute выполняет следующие функции: 2
Назначение ToolboxItemAttribute В Control1 и Control2означает, что каждый элемент управления области элементов.
Аргумент ToolboxItemAttribute конструктор, который показывает, является ли значение по умолчанию ToolboxItem или пользовательский класс, унаследованный от ToolboxItem используется, когда элемент управления добавляется в Панель элементов.
Экземпляр ToolboxItemAttribute будет присвоено Control1 создает с помощью аргумента true, который указывает на то, что он использует значение по умолчанию ToolboxItem класс, если он добавляется к Панель элементов.
Экземпляр ToolboxItemAttribute будет присвоено Control2 создает с помощью Type которого является производным от класса ToolboxItem" Control2_ToolboxItem.
ToolboxBitmapAttribute класс указывает, растровые изображения, используемые средой, чтобы определить элементы управления.
Внедрение растровое изображение в сборку, поместив его Действие при построении свойство Внедренный ресурс помещает растровое изображение в пространстве имен сборки. Следовательно, Control1.bmp может быть назван Company.LoadToolboxMembers.Control1.bmp.
ToolboxBitmapAttribute поддерживает конструктор, принимающий данный полный путь в качестве аргумента. Например, a ToolboxBitmapAttribute класс может быть применен к Control1 с помощью [ToolboxBitmap("Company.LoadToolboxMembers.Control1.bmp")].
Чтобы обеспечить гибкость в этом пошаговом руководстве используется конструктор, принимающий a Type класс как первый аргумент ToolboxBitmapAttribute конструктор. Пространство имен, которое используется для указания файла растрового изображения извлекается из Type и вставляется перед базовым именем растрового изображения.
Поскольку Type объект, реализующий Package" LoadToolboxMembersв Company.LoadToolboxMembers пространство имен [ToolboxBitmap(typeof(Control1), "Control1.bmp")] равно [ToolboxBitmap("Company.LoadToolboxMembers.Control1.bmp")].
DisplayNameAttribute указывает имя элемента управления Панель элементов.
Регистрация поставщика элементом управления панели элементов
Применить ProvideToolboxItemsAttribute класс к классу, реализующему Package влияет на параметры реестра результирующей VSPackage. Дополнительные сведения о параметрах реестра, a ToolboxItem поставщик см. в разделе Регистрация функции поддержки панели элементов.
Visual Studio среда использует аргумент версии к ProvideToolboxItemsAttribute конструктор для управления кэширование VSPackages, предоставляющий элементы Панель элементов. После загрузки VSPackage, чтобы обеспечить Панель элементов используемые элементы, кэшированную версию VSPackage до тех пор, пока зарегистрированной версия поставщика не будет изменить. Поэтому, если необходимо изменить продукт этого пошагового руководства, то после построения, убедитесь, что изменение аргумент версии ProvideToolboxItemsAttribute конструктор которому применяется к AddToolboxItem. Например, [ProvideToolboxItems(1)] быть изменено на [ProvideToolboxItems(2)]. Если версия не изменена; Visual Studio среда не загружает никаких изменений.
В этом пошаговом руководстве VSPackage настроены таким образом, чтобы обеспечить только Панель элементов элементы управления, поддерживающие по умолчанию формат буфера обмена. По умолчанию для списка форматов буфера обмена см. в разделе Панель элементов (Visual Studio). Если требуется поддержка других форматов буфера обмена или решение не поддерживать формат по умолчанию, примените атрибут ProvideToolboxFormatAttribute к LoadToolboxMembersPackage класс. Дополнительные сведения о регистрации a Предварительная разработка элемента управления панели элементовмониторинг поставщика см. в разделе Панель элементов .
Добавление элементов управления в панель элементов
Функциональность in CreateItemList эмулируется, что доступно в пределах System#Drawing#Design#IToolboxService#GetToolboxItems.
CreateItemList метод проверяет только non-аннотацию Type объекты, реализующие IComponent интерфейсы.
Следующие действия
Использование System#Drawing#Design#IToolboxService#GetToolboxItems вместо CreateItemList выполнил продукт этого пошагового руководства более надежным.
Можно также изменить CreateItemList использование ParseToolboxResource к элементам управления загрузки в Панель элементов на основе списка, внедренный в текст LoadToolboxMembers сборки.
См. также
Задачи
Предварительная разработка элемента управления панели элементов
Основные понятия
Регистрация функции поддержки панели элементов