연습: 동적으로 다음에 ToolboxItem 구성 사용자 지정
이 연습에서 어떻게 관리 VSPackage 동적 구성 지원을 제공할 수 있습니다 보여 줍니다 있는 ToolboxItem 개체입니다.
참고
사용자 지정 컨트롤을 도구 상자에 추가 하는 가장 간단한 방법은 Visual Studio 10 SDK와 함께 제공 되는 도구 상자 컨트롤 템플릿을 사용 하는 것입니다.이 항목에서는 고급 도구 개발에 관련이 있습니다.
서식 파일을 사용 하 여 도구 상자의 컨트롤 만들기에 대 한 자세한 내용은 참조 하십시오. 방법: Windows Forms을 사용 하는 도구 상자 컨트롤 만들기 및 방법: WPF를 사용 하 여 도구 상자 컨트롤을 만듭니다.
이 연습에서는 다음 단계를 안내합니다.
추가 하 고 올바르게 모든 등록 도구 상자 VSPackage 개체를 사용 하 여 컨트롤의 ToolboxItemAttribute 및 ToolboxBitmapAttribute 클래스입니다.
다음과 같은 두 가지 컨트롤 만들기 및 아이콘을 추가 하는 각각의 수는 도구 상자:
컨트롤에 연결 된 기본 선언 ToolboxItem.
선언에 연결 된 사용자 지정 컨트롤 도구 상자 에서 파생 된 항목은 ToolboxItem 클래스입니다.
구현 하는 쓰기 IConfigureToolboxItem, 및 다음 작업을 수행 하 여 등록:
파생 된 필터 클래스 정의 IConfigureToolboxItem 클래스 및 지정의 ToolboxItem 이 구현에서 역할을 할 경우.
적용 하는 ProvideToolboxItemConfigurationAttribute, 필터 클래스를 구현 하는 클래스를 참조는 Package 클래스는 VSPackage 합니다.
있는 Vspackage를 공급자로 등록 ToolboxItem 적용 하 여 개체는 ProvideToolboxItemsAttribute 를 구현 하는 클래스는 Package 클래스는 VSPackage.
패키지 로드 시간, 리플렉션을 사용 하 여 모든 목록을 생성 하려면 ToolboxItem 있는 Vspackage를 제공 하는 개체입니다.
에 대 한 처리기를 만들는 ToolboxInitialized 및 ToolboxUpgraded 이벤트입니다. 이 보장 하는 VSPackage ToolboxItem 개체는 제대로 로드 됩니다.
방법은 강제로 Vspackage에서 명령을 구현에서 도구.
사전 요구 사항
이 연습을 완료 하려면 설치 해야 해당 Visual Studio 2010 SDK.
참고
Visual Studio SDK에 대 한 자세한 내용은 참조 하십시오. Visual Studio 개요를 확장합니다..Visual Studio SDK를 다운로드 하는 방법를 참조 하십시오. Visual Studio 확장성 개발자 센터 MSDN 웹 사이트에서.
Visual Studio 패키지 프로젝트 템플릿에 대해 위치
세 가지 다른 위치에서 찾을 수 있습니다 Visual Studio 패키지 프로젝트 서식 파일은 새 프로젝트 대화 상자:
아래에서 Visual Basic 확장성. 프로젝트의 기본 언어는 Visual Basic입니다.
C#에서 확장 합니다. 프로젝트의 기본 언어는 C#입니다.
아래에서 기타 프로젝트 형식 확장성. 프로젝트의 기본 언어는 c + +입니다.
관리 되는 VSPackage 만들기
관리 되는 Vspackage를 만들려면 다음 절차를 완료 합니다.
도구 상자 항목을 제공 하는 관리 되는 Vspackage를 만들려면
명명 된 있는 VSPackage 만들기 ItemConfiguration. 자세한 내용은 Visual Studio 패키지 템플릿을 사용 하 여 연습: 메뉴 명령 만들기를 참조하십시오.
에 Visual Studio 패키지 서식 파일 메뉴 명령을 추가 합니다.
명령 이름을 지정 초기화 ItemConfigurationVB Visual Basic 대 한 또는 를 초기화 하는 ItemConfigurationCS Visual C#에 대 한.
에 대 한 Visual Basic에서 생성 된 프로젝트에서 가져온된 네임 스페이스 목록에 다음 네임 스페이스를 추가 합니다.
Company.ItemConfiguration
시스템
System.ComponentModel
System.Drawing
System.Windows.Forms
추가 대 한 참조를 System.Drawing.Design .NET Framework 구성 요소입니다.
이 연습에서는 둘 이상의 언어를 수행 하면 생성 된 어셈블리를 명확 하 게 프로젝트를 업데이트 해야 합니다.
Visual Basic 및 C# VSPackages 시각적 명확 하 게
For Visual Basic:
프로젝트 속성을 연 다음 선택은 응용 프로그램 탭.
어셈블리 이름으로 변경 ItemConfigurationVB, 기본 네임 스페이스를 변경 하 고 Company.ItemConfigurationVB.
선택은 참조 탭.
가져온된 네임 스페이스 목록 업데이트.
Company.itemconfiguration를 제거 합니다.
Company.itemconfigurationvb를 추가 합니다.
For Visual C#:
프로젝트 속성을 연 다음 선택은 응용 프로그램 탭.
어셈블리 이름으로 변경 ItemConfigurationCS, 기본 네임 스페이스를 변경 하 고 Company.ItemConfigurationCS.
ItemConfigurationPackage 클래스의 코드 편집기를 엽니다.
리팩터링 도구를 사용 하는 기존 네임 스페이스의 이름을 변경 하 고 기존 네임 스페이스 이름을 마우스 오른쪽 단추로 클릭 합니다 ItemConfiguration, 가리킨 리팩터링, 클릭 하 고 다음을 클릭 이름 바꾸기. 이름으로 변경 ItemConfigurationCS.
모든 변경 내용을 저장 합니다.
생성 된 코드를 테스트 하려면
컴파일하고 있는 VSPackage Visual Studio 실험적 하이브를 시작 합니다.
에 도구 메뉴를 클릭 초기화할 항목이 구성 VB 또는 초기화 항목 구성 작성일.
이 패키지의 메뉴 항목이 처리기가 호출 되었다는 것을 나타내는 텍스트가 있는 메시지 상자를 엽니다.
실험적인 버전을 닫습니다 Visual Studio.
도구 상자 컨트롤 만들기
이 섹션에서 만들어 사용자 정의 컨트롤을 등록 Control1은 관련된 된 기본 선언 도구 항목입니다. 도 만들고 두 번째 사용자 정의 컨트롤을 등록 Control2, 하는 연결 된 사용자 지정 도구 상자 항목을 Control2_ToolboxItem, 즉 파생의 ToolboxItem 클래스입니다. Windows Forms 컨트롤을 제작 하는 방법에 대 한 자세한 내용은 및 ToolboxItem 클래스를 참조 하십시오 디자인할 때 Windows Forms 컨트롤 개발.
기본 및 사용자 지정 도구 상자 항목을 만들려면
지침을 사용 하 여 연습: 자동 로드 도구 상자 항목 는 기본값을 만들 수 도구 상자 항목 및 사용자 지정 도구 상자 항목을 다음과 같은.
절차를 완료 "를 만들 수는 도구 상자 다음에 ToolboxItem 기본으로 사용 되는 컨트롤입니다." 업데이트는 DescriptionAttribute 이 프로젝트를 참조 합니다.
에 대 한 결과 코드를 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 VB")> _ <Description("Custom toolbox item from package ItemConfiguration.")> _ <ToolboxItem(True)> _ <ToolboxBitmap(GetType(Control1), "Control1.bmp")> _ Public Class Control1 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
using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace Company.ItemConfigurationCS { // 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 ItemConfiguration.")] [ToolboxItem(true)] [ToolboxBitmap(typeof(Control1), "Control1.bmp")] public partial class Control1 : UserControl { public Control1() { InitializeComponent(); button1.Text = this.Name + " Button"; } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello world from " + this.ToString()); } } }
절차를 완료 "만들 수는 도구 상자 다음에 Toolboxitem에서 파생 된 사용자 지정 클래스를 사용 하 여 제어 합니다." 업데이트는 DescriptionAttribute 이 프로젝트를 참조 합니다.
에 대 한 결과 코드는 Control2 및 Control2_ToolboxItem 클래스 다음 코드를 유사 합니다.
Imports System.Drawing.Design Imports System.Globalization ' 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 ItemConfiguration.")> _ <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 <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
using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Drawing.Design; using System.Globalization; namespace Company.ItemConfigurationCS { // 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 ItemConfigurationPackage.")] [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()); } } [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); } } }
파일을 저장합니다.
비트맵 아이콘 포함
ToolboxBitmapAttribute 각 컨트롤에 적용 되는 특성 해당 컨트롤에 연결 하는 아이콘을 지정 합니다. 두 컨트롤 모두에 대 한 비트맵을 만들고 다음과 같이 이름을:
Control1.bmp에 있는 Control1 클래스입니다.
Control2.bmp에 있는 Control2 클래스입니다.
도구 상자 항목에 대 한 비트맵 아이콘을 포함 하려면
새 비트맵을 프로젝트에 다음과 같이 추가 합니다.
솔루션 탐색기, VSPackage 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 가리킨 추가에서 다음을 클릭 하 고 새 항목.
에 새 항목 추가 선택 대화 상자에서 비트맵 파일, 비트맵 이름을 입력 하 고 있습니다.
비트맵 편집기를 16∝16 아이콘을 다음과 같이 만들 수 있습니다.
보기 메뉴에서 속성 창을 클릭합니다.
에 속성이 창 설정 높이 및 폭 16.
편집기를 사용 하 여 아이콘 이미지를 만듭니다.
솔루션 탐색기비트맵 항목을 마우스 오른쪽 단추로 클릭 하 고 다음을 클릭 속성이.
설정에서 빌드 작업 속성을 포함 리소스.
열려 있는 모든 파일을 저장 합니다.
도구 상자 동적 구성 공급자 추가
이 섹션에서 작성 하 고 구현 하는 클래스를 등록은 IConfigureToolboxItem 인터페이스입니다. 이 클래스를 인스턴스화하고 사용 하는 있는 Visual Studio 통합된 개발 환경 (IDE)를 구성 하려면 도구 상자 컨트롤입니다.
참고
때문에 Visual Studio 환경 구현 인스턴스를 인스턴스화합니다 IConfigureToolboxItem를 구현 하지 않는 IConfigureToolboxItem 인터페이스를 구현 하는 클래스에서 Package 있는 Vspackage를.
만들기 및 도구 상자 컨트롤 구성 개체를 등록 하려면
솔루션 탐색기ItemConfiguration 프로젝트에 클래스를 추가 하 고 이름을 ToolboxConfig.
다음 네임 스페이스 문을 파일에 추가 합니다.
Imports Microsoft.VisualStudio.Shell Imports System.Collections Imports System.ComponentModel Imports System.Drawing.Design Imports System.Reflection Imports System.Runtime.InteropServices Imports System.Security.Permissions
using Microsoft.VisualStudio.Shell; using System.Collections; using System.ComponentModel; using System.Drawing.Design; using System.Reflection; using System.Runtime.InteropServices; using System.Security.Permissions;
확인는 ToolboxConfig 클래스입니다 public 를 구현 하는 IConfigureToolboxItem 인터페이스.
Apply a GuidAttribute and a ProvideAssemblyFilterAttribute to the ToolboxConfig class.
에 대 한 Visual Basic의 어셈블리 이름을 사용 하 여 "ItemConfigurationVB, 버전 = *, Culture = *, 괄호 = *".
에 대 한 Visual C#의 어셈블리 이름을 사용 하 여 "ItemConfigurationCS, 버전 = *, Culture = *, 괄호 = *".
이렇게 하면 이렇게 제한의 ToolboxConfig 클래스에서 작업을 ToolboxItem 현재 VSPackage 있는 어셈블리에 의해 제공 된 개체입니다.
<ProvideAssemblyFilter("ItemConfigurationVB, Version=*, Culture=*, PublicKeyToken=*")> _ <Guid("4DDC7895-442A-45e7-82E7-4E85F243C321")> _ Public Class ToolboxConfig Implements IConfigureToolboxItem
[ProvideAssemblyFilter("ItemConfigurationCS, Version=*, Culture=*, PublicKeyToken=*")] [Guid("E6832593-BF07-4de1-AA0F-7F9B94887DB8")] public class ToolboxConfig : IConfigureToolboxItem
클릭 하 여 GUID를 생성할 수 있습니다 GUID 만들기 에 있는 도구 메뉴. 선택 형식 사각형이 중괄호를 클릭 복사, 다음 코드에서 GUID를 붙여 넣습니다. 키워드 변경 GUID 에 Guid.
구현은 ConfigureToolboxItem 메서드는 IConfigureToolboxItem 메서드만의 두 가지 역할을 수행 하는 인터페이스 ToolboxItem 클래스를 Control1 및 Control2.
구현 ConfigureToolboxItem 인스턴스가 적용 됩니다 ToolboxItemFilterAttribute 에 두 ToolboxItem 개체 있도록:
ToolboxItem 에서 구현 됩니다 Control1 에서만 사용할 수 있습니다의 도구 상자 처리 하는 디자이너를 위한 UserControl 개체입니다.
ToolboxItem 에서 구현 됩니다 Control2 을 사용할 수 없습니다의 도구 상자 를 처리 하는 디자이너를 위한 UserControl 개체.
<PrincipalPermission(SecurityAction.Demand)> Public Sub _ ConfigureToolboxItem(ByVal item As ToolboxItem) _ Implements IConfigureToolboxItem.ConfigureToolboxItem If item Is Nothing Then Return ' Create a filter for the Toolbox. Dim newFilter As ToolboxItemFilterAttribute If GetType(Control1).ToString() = item.TypeName Then ' For Control1, only show it when editing a UserControl. newFilter = New ToolboxItemFilterAttribute( _ "System.Windows.Forms.UserControl", _ ToolboxItemFilterType.Require) ElseIf GetType(Control2).ToString() = item.TypeName Then ' For Control2, only show it when not editing a UserControl. newFilter = New ToolboxItemFilterAttribute( _ "System.Windows.Forms.UserControl", _ ToolboxItemFilterType.Prevent) Else ' Don't apply a filter to other classes. Return End If item.Filter = CType(New ToolboxItemFilterAttribute() {newFilter}, ICollection) End Sub
[PrincipalPermission(SecurityAction.Demand)] public void ConfigureToolboxItem(ToolboxItem item) { if (null == item) return; // Create a filter for the Toolbox. ToolboxItemFilterAttribute newFilter; if (typeof(Control1).ToString() == item.TypeName) { // For Control1, only show it when editing a UserControl. newFilter = new ToolboxItemFilterAttribute( "System.Windows.Forms.UserControl", ToolboxItemFilterType.Require); } else if (typeof(Control2).ToString() == item.TypeName) { // For Control2, only show it when not editing a UserControl. newFilter = new ToolboxItemFilterAttribute( "System.Windows.Forms.UserControl", ToolboxItemFilterType.Prevent); } else { // Don't apply a filter to other classes. return; } item.Filter = (ICollection)(new ToolboxItemFilterAttribute[] { newFilter }); }
VSPackage 구현 수정
기본 구현에 의해 제공 되는 VSPackage Visual Studio 다음과 같은 작업을 수행할 패키지 템플릿을 수정 해야 합니다.
등록 된 도구 상자 공급자 항목입니다.
동적을 제공 하는 클래스를 등록 도구 상자 있는 VSPackage 구성을 제어 합니다.
사용은 ToolboxService 모두 로드할 수는 ToolboxItem VSPackage 어셈블리에 의해 제공 된 개체입니다.
처리 ToolboxInitialized 및 ToolboxUpgraded 이벤트입니다.
도구 상자 항목에 있는 VSPackage 공급자에 대 한 패키지 구현을 수정 하기
ItemConfigurationPackage 클래스의 코드 편집기를 엽니다.
수정할 수는 있는 ItemConfigurationPackage 가 구현 하는 클래스의의 Package 클래스 솔루션에서.
다음 네임 스페이스 문을 파일에 추가 합니다.
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 등록할 수 도구 상자 항목 적용은 ProvideToolboxItemsAttribute 패키지. 등록 하는 ToolboxConfig 제공 하는 클래스는 도구 상자 동적 구성, 적용 한 ProvideToolboxItemConfigurationAttribute 패키지.
' ... <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.guidItemConfigurationPkgString)> _ <ProvideToolboxItems(1)> _ <ProvideToolboxItemConfiguration(GetType(ToolboxConfig))> _ Public NotInheritable Class DynamicToolboxMembersPackage Inherits Package
// ... [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.guidItemConfigurationPkgString)] [ProvideToolboxItems(1)] [ProvideToolboxItemConfiguration(typeof(ToolboxConfig))] public sealed class DynamicToolboxMembersPackage : Package
참고
유일한 인수를 ProvideToolboxItemsAttribute 의 버전이 ToolboxItem Vspackage가 제공 됩니다.이 값을 변경 하면 캐시에 이전 버전에 있는 경우에 있는 VSPackage 로드 하려면 IDE 강제로 ToolboxItem.
2 새로 만들기 private 에서 필드는 ItemConfiguration 클래스는 다음과 같이:
ArrayList 라는 멤버를 ToolboxItemList, 목록을 보유 하는 ToolboxItem 개체의 ItemConfiguration 클래스는 관리.
A String, 명명 된 CategoryTab, 포함 된는 도구 상자 보유 하는 데 사용 되는 탭의 ToolboxItem 개체의 ItemConfiguration 클래스는 관리.
Private ToolboxItemList As ArrayList Private Shared ReadOnly CategoryTab As String = _ "ItemConfiguration Walkthrough VB"
private ArrayList ToolboxItemList; private static readonly string CategoryTab = "ItemConfiguration Walkthrough CS";
이 수정 작업의 결과 다음 코드와 유사합니다.
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.guidItemConfigurationPkgString)> _ <ProvideToolboxItems(1)> _ <ProvideToolboxItemConfiguration(GetType(ToolboxConfig))> _ Public NotInheritable Class DynamicToolboxMembersPackage Inherits Package Private ToolboxItemList As ArrayList Private Shared ReadOnly CategoryTab As String = _ "ItemConfiguration 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.ItemConfigurationCS { // ... [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.guidItemConfigurationPkgString)] [ProvideToolboxItems(1)] [ProvideToolboxItemConfiguration(typeof(ToolboxConfig))] public sealed class DynamicToolboxMembersPackage : Package { private ArrayList ToolboxItemList; private static readonly string CategoryTab = "ItemConfiguration Walkthrough CS"; // ...
정의 OnRefreshToolbox 를 처리 하는 메서드는 ToolboxInitialized 및 ToolboxUpgraded 이벤트입니다.
OnRefreshToolbox 목록을 메서드를 사용 하 여 ToolboxItem 에 포함 된 개체를 ToolboxItemList 필드 및 다음 작업을 수행:
모두 제거 ToolboxItem 에서 개체는 도구 상자 탭 정의 되는 CategoryTab 필드.
추가 도구 상자 의 모든 새로운 인스턴스 탭 ToolboxItem 나열 된 개체를 ToolboxItemList 필드입니다.
세트는 도구 탭을 현재 탭으로 합니다.
' Add new instances of all ToolboxItems to the toolbox item list. Private Sub OnRefreshToolbox(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.ToolboxInitialized, Me.ToolboxUpgraded Dim service As IToolboxService = _ TryCast(GetService(GetType(IToolboxService)), IToolboxService) Dim toolbox As IVsToolbox = _ TryCast(GetService(GetType(IVsToolbox)), IVsToolbox) ' Remove target tab and all items under it. For Each item As ToolboxItem In service.GetToolboxItems(CategoryTab) service.RemoveToolboxItem(item) Next toolbox.RemoveTab(CategoryTab) ' Recreate the target tab with the items from the current list. For Each item As ToolboxItem In ToolboxItemList service.AddToolboxItem(item, CategoryTab) Next service.SelectedCategory = CategoryTab service.Refresh() End Sub
// Add new instances of all ToolboxItems to the toolbox item list. void OnRefreshToolbox(object sender, EventArgs e) { IToolboxService service = GetService(typeof(IToolboxService)) as IToolboxService; IVsToolbox toolbox = GetService(typeof(IVsToolbox)) as IVsToolbox; // Remove target tab and all items under it. foreach (ToolboxItem item in service.GetToolboxItems(CategoryTab)) { service.RemoveToolboxItem(item); } toolbox.RemoveTab(CategoryTab); // Recreate the target tab with the items from the current list. foreach (ToolboxItem item in ToolboxItemList) { service.AddToolboxItem(item, CategoryTab); } service.SelectedCategory = CategoryTab; service.Refresh(); }
에 대 한 Visual C#, 생성자에서 등록은 OnRefreshToolbox 방법으로 이벤트 처리기에 대 한의 ToolboxInitialized 및 ToolboxUpgraded 이벤트.
this.ToolboxInitialized += new EventHandler(OnRefreshToolbox); this.ToolboxUpgraded += new EventHandler(OnRefreshToolbox);
수정는 Initialize 메서드를 ItemConfigurationPackage 채울 수는 ToolboxItemList 필드를 호출 하 여는 GetToolboxItems 메서드는 ToolboxService 클래스. 도구 상자 모든 서비스를 가져옵니다는 도구 상자 항목을 현재 실행 중인 어셈블리에서 정의 되는 클래스입니다. ToolboxItemList 가 사용 되는 도구 상자 를 로드 하는 이벤트 처리기는 도구 상자 항목.
Initialize 메서드의 끝에 다음 코드를 추가합니다.
' Use the toolbox service to get a list of all toolbox items in ' this assembly. ToolboxItemList = New ArrayList( _ ToolboxService.GetToolboxItems(Me.GetType().Assembly, "")) If ToolboxItemList Is Nothing Then Throw New ApplicationException( _ "Unable to generate a toolbox item listing for " & _ Me.GetType().FullName) End If ' Update the display name of each toolbox item in the list. Dim thisAssembly As Assembly = Me.GetType().Assembly For Each item As ToolboxItem In ToolboxItemList Dim underlyingType As Type = thisAssembly.GetType(item.TypeName) Dim attribs As AttributeCollection = _ TypeDescriptor.GetAttributes(underlyingType) Dim displayName As DisplayNameAttribute = _ TryCast(attribs(GetType(DisplayNameAttribute)), DisplayNameAttribute) If displayName IsNot Nothing AndAlso Not displayName.IsDefaultAttribute() Then item.DisplayName = displayName.DisplayName End If Next
// Use the toolbox service to get a list of all toolbox items in // this assembly. ToolboxItemList = new ArrayList( ToolboxService.GetToolboxItems(this.GetType().Assembly, "")); if (null == ToolboxItemList) { throw new ApplicationException( "Unable to generate a toolbox item listing for " + this.GetType().FullName); } // Update the display name of each toolbox item in the list. Assembly thisAssembly = this.GetType().Assembly; foreach (ToolboxItem item in ToolboxItemList) { Type underlyingType = thisAssembly.GetType(item.TypeName); AttributeCollection attribs = TypeDescriptor.GetAttributes(underlyingType); DisplayNameAttribute displayName = attribs[typeof(DisplayNameAttribute)] as DisplayNameAttribute; if (displayName != null && !displayName.IsDefaultAttribute()) { item.DisplayName = displayName.DisplayName; } }
참고
연습을 한 수 있는 VSPackage 또는 항목의 버전을 테스트 하는 메커니즘을 개발 및 VSPackage 버전이 변경 된 경우 또는 경우에 업데이트의 버전을 ToolboxItem 변경 되었습니다.
도구 상자를 초기화 하는 중
도구 상자를 초기화 하는 명령이 구현 하기
에 ItemConfigurationPackage 클래스에서 변경의 MenuItemCallBack 메서드를 메뉴 항목의 명령 처리기입니다.
기존 구현을 대체는 MenuItemCallBack 메서드에 다음 코드를 사용 하 여:
Private Sub MenuItemCallback(ByVal sender As Object, ByVal e As EventArgs) Dim pkg As IVsPackage = TryCast(GetService(GetType(Package)), IVsPackage) pkg.ResetDefaults(CUInt(__VSPKGRESETFLAGS.PKGRF_TOOLBOXITEMS)) End Sub
private void MenuItemCallback(object sender, EventArgs e) { IVsPackage pkg = GetService(typeof(Package)) as IVsPackage; pkg.ResetDefaults((uint)__VSPKGRESETFLAGS.PKGRF_TOOLBOXITEMS); }
빌드하고 솔루션을 실행 합니다.
실험적 하이브에서 실행 되는 Visual Studio 인스턴스를 사용 하 여이 연습을 제품을 발휘할 수 있습니다.
이 연습을 실행 하려면
Visual Studio는 빌드 메뉴를 클릭 솔루션 다시 빌드.
두 번째 인스턴스를 시작 하려면 F5 키를 눌러 Visual Studio 실험 레지스트리 하이브에 있습니다.
실험적 하이브를 사용 하는 방법에 대 한 자세한 내용은 참조 하십시오. Visual Studio 인스턴스를 실험.
도구 메뉴를 클릭합니다.
명명 된 명령을 초기화 ItemConfiguration VB 또는 ItemConfiguration 작성일 초기화 와 함께 숫자 1을 가진 아이콘의 메뉴 상단에 나타납니다.
새로운 Visual C# 또는 Visual Basic Windows Forms 응용 프로그램입니다.
A Form-기반된 디자이너가 나타납니다.
사용자 정의 컨트롤을 프로젝트에 추가 합니다.
사용자 정의 컨트롤 디자이너를 표시 합니다.
핀은 도구 상자 열고 두 디자인 보기 사이 전환 합니다.
새 열은 도구 상자 항목을 볼 수 및 숨겨진 어떤 것을 어떤 디자이너에 포커스가 있는 따라 다릅니다.
첫 번째 끕니다 도구 상자 항목에 사용자 정의 컨트롤의 인스턴스를 추가 하려면 Control1 사용자 정의 컨트롤입니다.
두 번째 드래그 도구 상자 항목의 인스턴스를 추가 하려면 양식 Control2 양식입니다.
Windows 응용 프로그램을 빌드하십시오.
이제 응용 프로그램에 대 한 사용자 정의 컨트롤을 사용할 수 있습니다에서 도구.
응용 프로그램의 사용자 정의 컨트롤을 폼에 추가 응용 프로그램을 다시 작성 및 실행 합니다.
응용 프로그램을 실행 하면 각 컨트롤에 연결 된 메시지 상자를 표시할 폼을 클릭 합니다.
분석의 구현
때문에 assemblyFilter 매개 변수의 수에 ProvideAssemblyFilterAttribute 만 클래스 생성자 ToolboxItem 개체에이 연습에서 만든 어셈블리는 처리에 의해는 ConfigureToolboxItem 메서드를는 ToolboxConfg 클래스입니다.
따라서,는 ItemConfiguration 연습 범주에 활성화 되어는 도구 상자의 ConfigureToolboxItem 메서드를는 ToolboxConfg 클래스를 호출할 및 ToolboxItemFilterAttribute 의 인스턴스에 적용 되는 ToolboxItem 에 의해 구현 되는 개체 Control1 및 Control2.