다음을 통해 공유


연습: 속성 창, 작업 목록, 출력 창 및 옵션 대화 상자 (4 / 4 부)로 통합

사용 하 여 해당 Visual Studio SDK, 모든 도구 창에 액세스 하는 코드를 사용할 수 있습니다 Visual Studio. 에 항목을 추가할 수 있습니다 예를 들어,는 작업 목록, 텍스트에 추가 출력 창, 또는 확장으로 통합는 속성 창 속성을 설정 하 여 사용자가 확장명을 구성할 수 있도록 합니다. 이 연습에서 도구 창에 사용자 지정 확장을 통합 하는 방법을 보여 줍니다. Visual Studio.

이 연습을 완료 하 여 다음 작업을 수행 하는 방법을 배울 수 있습니다.

  • 있는 VSPackage 패키지 템플릿을 사용 하 여 만듭니다.

  • 생성 된 도구 창을 구현 합니다.

  • 메뉴 명령 처리기를 구현 합니다.

  • 옵션 페이지를 만듭니다.

  • 데이터를 사용할 수 있게는 속성이 창입니다.

  • 속성 창으로 통합할 수 있습니다.

  • 텍스트에 추가 하는 출력 창과 항목에 작업 목록.

이 연습에서는 Visual Studio IDE를 확장 하는 방법에 설명 하는 일련의 일부입니다. 자세한 내용은 Visual Studio Vspackages를 사용 하 여 사용자 지정 연습를 참조하십시오.

사전 요구 사항

이 연습을 완료 하려면 설치 해야 해당 Visual Studio 2010 SDK.

참고

Visual Studio SDK에 대 한 자세한 내용은 참조 하십시오. Visual Studio 개요를 확장합니다..Visual Studio SDK를 다운로드 하는 방법를 참조 하십시오. Visual Studio 확장성 개발자 센터 MSDN 웹 사이트에서.

Visual Studio 패키지 프로젝트 템플릿에 대해 위치

세 가지 다른 위치에서 찾을 수 있습니다 Visual Studio 패키지 프로젝트 서식 파일은 새 프로젝트 대화 상자:

  1. 아래에서 Visual Basic 확장성. 프로젝트의 기본 언어는 Visual Basic입니다.

  2. C#에서 확장 합니다. 프로젝트의 기본 언어는 C#입니다.

  3. 아래에서 기타 프로젝트 형식 확장성. 프로젝트의 기본 언어는 c + +입니다.

있는 VSPackage Visual Studio 패키지 템플릿을 사용 하 여 만들기

있는 Vspackage를 만들려면

  1. 있는 Vspackage를 만듭니다. 있는 Vspackage를 만드는 방법에 대 한 자세한 내용은 참조 하십시오. Visual Studio 패키지 템플릿을 사용 하 여 연습: 메뉴 명령 만들기.

  2. 프로젝트의 이름을 할 일 모음, C# 또는 Visual Basic 언어 설정의 VSPackage 옵션 선택 페이지에서 모두를 선택 메뉴 명령 을 및 도구 창을.

  3. 에 있는 명령 옵션 페이지에서 설정 명령 이름 에 작업 관리자 및 명령 ID 에 cmdidTodoCommand.

  4. 도구 창의 옵션 페이지에서 설정 창의 이름 에 작업 관리자 및 명령 ID 에 cmdidTodoTool.

  5. 마침 단추를 클릭합니다.

생성 된 도구 창의 구현

패키지 템플릿을 기본 도구 창을 사용자 정의 컨트롤의 폼에 생성 합니다. 그러나, 아무 기능이 있습니다. 기능을 제공 합니다 자식 컨트롤을 추가 하 고 MyControl.xaml.cs 또는 Mycontrol.vb의 코드를 수정 해야 합니다.

도구 창이 포함 됩니다는 TextBox 새로운 ToDo 항목을 입력 하는 Button 목록에 새 항목을 추가 하려면 a ListBox 목록에 있는 항목을 표시 합니다. 완성 된 도구 창의 다음 그림을 다음과 비슷합니다.

완료된 도구 창

도구 창에 컨트롤을 추가 하려면

  1. 단추, 텍스트 및 StackPanel 컨트롤에서 삭제 합니다.

    참고

    나중에 다시 사용할 수 있습니다 하 여 button1_Click 이벤트 처리기는 삭제 되지 않습니다.

  2. 모든 WPF 컨트롤 섹션의 도구 상자, 드래그는 캔버스 컨트롤이 자동으로 눈금.

  3. 캔버스에 텍스트 상자 컨트롤, Button 컨트롤 및 목록 상자 컨트롤 놓습니다. 위의 그림에서와 같이 정렬할.

  4. 단추를 선택 합니다. 설정의 콘텐츠 속성을 추가.

  5. XAML 창에서 단추 이벤트 처리기를 단추 컨트롤의 클릭을 추가 하 여 다시 연결 = "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. 이제 매개 변수는 생성자를 호출 하는 코드를 추가 합니다.

    솔루션 탐색기, 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 클래스의 생성자를 만드는 데 필요 합니다.)

메뉴 명령 처리기 구현

할 일 모음 프로젝트를 만들 때 메뉴 항목에 대 한 기본 처리기를 포함 합니다. 처리기는 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);
    }        
    

    작업을 저장 하 고과 Visual Studio 실험적인 빌드에 열고 F5 키를 누릅니다. 클릭 하 여 도구 창을 여는 지 여부를 테스트 합니다. 작업 관리자 에 있는 도구 메뉴.

    실험적인 빌드는 계속 하기 전에 닫습니다.

옵션 페이지를 만들기

페이지를 제공할 수 있는 옵션 도구 창에 대 한 설정을 사용자가 변경할 수 있도록 대화 상자. 옵션 페이지를 만들려면 옵션 및 TodoListPackage.cs 또는 TodoListPackage.vb 파일에 있는 항목에 설명 합니다. 두 클래스가 있어야 합니다.

옵션 페이지를 만들려면

  1. 솔루션 탐색기, 할 일 모음 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 가리킨 추가에서 다음을 클릭 하 고 클래스.

  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. 솔루션 탐색기, TodoListPackage.cs 또는 Todolistpackage.vb를 엽니다.

  2. 포함 된 줄을 찾습니다 있는 ProvideToolWindowAttribute 특성을 누른 다음 추가 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)]
    

    참고

    단어 'Attribute' 특성 선언에 포함할 필요가 없습니다.

  3. 파일을 저장합니다.

    ProvideOptionPage 생성자에 첫 번째 매개 변수는 이전에 만든 ToolsOptions 클래스의 형식입니다. 두 번째 매개 변수가 "할 일"의 범주에 이름이 있는 옵션 대화 상자. 세 번째 매개의 하위 범주 이름을 "일반"입니다 있는 옵션 위치 옵션 페이지에서 사용할 수 있는 대화 상자입니다. 다음 두 매개 변수는 문자열 리소스 Id입니다. 첫 번째 범주의 이름이 고 두 번째 하위 범주 이름입니다. 자동화를 사용 하 여이 페이지에 액세스할 수 있는지 여부는 최종 매개 변수를 설정 합니다.

    사용자의 옵션 페이지에 액세스할 때 다음 그림을 유사 합니다.

    옵션 페이지

    할 일 항목 및 일반 하위 범주를 확인할 수 있습니다.

속성 창에 데이터를 사용할 수 있도록

좋은 객체 지향 설계에 대 한 다음과 같은 원칙에 따라의 할 일 목록에서 개별 항목에 대 한 정보를 저장 하는 ToDoItem 라는 클래스를 만들 수 있습니다.

속성 창에서 데이터를 사용할 수 있도록.

  1. 솔루션 탐색기, 할 일 모음 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 가리킨 추가에서 다음을 클릭 하 고 클래스.

  2. 새 항목 추가 대화 상자에서 파일 이름 ToDoItem.cs 또는 ToDoItem.vb, 다음을 클릭 하 고 추가.

    도구 창을 사용자에 게 제공 하는 경우 ToDoItem 인스턴스에서 항목 목록 상자에 표시 됩니다. 사용자 목록 상자에서 이러한 항목 중 하나를 선택 하면 해당 속성이 창 항목에 대 한 정보가 표시 됩니다.

    데이터에서 사용 하는 속성 창 클래스의 공용 속성에는 데이터를 수 및 다음 두 가지 특수 한 특성 설명 및 범주를 사용 하 여 문서화 합니다. 설명 아래에 표시 되는 텍스트입니다 있는 속성이 창. 범주 정의 속성 시기 표시 되어야의 속성 창에서 항목별 보기 표시 됩니다. 다음 그림에는 속성 창이 있는 항목별 보기에는 이름 속성에는 할 일 필드 범주를 선택 고에 대 한은 이름 속성 창의 맨 아래에 표시 됩니다.

    속성 창

  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. 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();
            }
        }
    }
    

    두 가지 속성을 이름 및 Duedate이이 코드가 있습니다. 다음에 표시 되는 두 속성입니다의 속성 이전 그림에 표시 된 창입니다. 각 속성 표시에 대 한 정보를 제공 합니다. 설명 및 범주 속성 앞에 속성 창입니다. 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 라는 private 멤버를 선언 합니다. 와 함께이 작업 항목의 이름을 나타내는 문자열을 매개 변수로 사용자 컨트롤은 생성자를 사용 합니다. 처음 세 줄에서 생성자의에서 사용자 정의 컨트롤, 이름, 현재 날짜 및 시간을 저장합니다.

    앞에서 만든 옵션 페이지에서 DaysAhead 옵션을 사용 하면에 대 한 기준으로 현재 날짜와 시간을 사용할 수 있습니다. 현재 날짜와 시간을 기한으로 일반적으로 사용 되지 않습니다 때문에 현재 날짜를 옵션 페이지에 지정 된 일 수를 기준으로 발전할 수 있습니다. .

    코드 라는 지역 변수를 선언 합니다. daysAhead DaysAhead 옵션에는 값을 사용 하 여 설정 됩니다. 다음 줄 패키지 멤버 여기에서 하 고 사용자 정의 컨트롤의 부모를 가져옵니다. (이전 MyControl.xaml.cs 클래스에 추가한 멤버 _parent을 사용 하는 위치입니다.)

    이 패키지 멤버가 null이 아닌 경우는 ToolsOptions 인스턴스를 보유할 개체 선언 됩니다. 인스턴스를 가져오려면 코드 패키지의 GetAutomationObject 멤버를 호출 하 고 이름을 범주 및 하위 범주를 단일 점 구분 된 문자열로 전달 합니다 Do.General. 결과 obj 변수에 출력 매개 변수로 전달 됩니다.

    Obj 변수에 ToolsOptions 클래스에 캐스팅 되어 라는 변수에 저장 options. 이 변수는 null이 아닌 경우의 코드를 가져옵니다는 DaysAhead 멤버에 저장은 _daysAhead 변수.

    코드 다음 발전은 _duedate 변수를 사용 하 여 미리 일 수 만큼의 AddDays 메서드.

  6. 때문에 인스턴스를의 ToDoItem 클래스 목록 상자에 저장 및 목록 상자를 호출 하는 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 메서드는 부모 컨트롤입니다; 목록 상자 업데이트 메서드가 호출 되는 Name 및 DueDate 속성에이 클래스가 변경 됩니다. 나중에 이러한 메서드를 구현 합니다.

속성 창에 통합

지금에 연결할 수 있는 목록 상자를 관리 하는 코드를 작성의 속성이 창입니다.

텍스트 상자를 읽기는 ToDoItem 인스턴스를 만들고 인스턴스 목록 상자에 추가 하는 단추에 대 한 핸들을 추가 해야 합니다.

속성 창으로 통합할 수

  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 인스턴스를 만듭니다 및 매개 변수 텍스트 상자 컨트롤에 사용자가 입력 한 텍스트와 함께 사용자 컨트롤 인스턴스에 전달 합니다. 다음으로 코드 항목을 목록 상자에 추가합니다. (목록 상자는 목록 상자에 표시 되는 문자열을 검색 하는 ToDoItem 인스턴스의 ToString 메서드를 호출 합니다.) 다음으로, 코드가 나중에 작성 되는 TrackSelection 함수를 호출 합니다. 마지막으로, 코드 오류를 확인 합니다.

  3. 사용자 목록 상자에서 새 항목의 선택을 처리 하는 코드를 추가 하는 Mycontrol.xaml의 디자인 보기로 전환 합니다.

  4. 목록 상자 컨트롤을 클릭 합니다. 에 속성 창에서 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. 작업한 내용을 저장합니다. 프로젝트를 빌드 및 입력 오류를 찾습니다.

  7. 와 통합을 제공 하는 TrackSelection 함수를 이제 채우기는 속성 창입니다. 사용자가 목록 상자에 항목을 추가 하거나 목록 상자에서 항목을 클릭 하면이 함수가 호출 됩니다.

    클래스를 만들었으므로 하는 속성 창을 사용할 수 있습니다, 통합 하 여는 속성 창이 도구 창이. 도구 창의 목록 상자에서 항목을 클릭할 때 해당 속성 윈도우를 적절 하 게 업데이트 해야 합니다. 마찬가지로 사용자가 변경 되 면 작업 항목에는 속성 창에서 연관 된 항목을 업데이트 해야 합니다.

    참고

    대신 생성할 수 있습니다 PropertyChanged 을 구현 하 여 직접 이벤트는 INotifyPropertyChanged 인터페이스.

    업데이트 하는 코드를 삽입는 속성 TrackSelection 함수에서 창. 이 독점 하는 ToDoItem 개체의 속성 수도 있습니다. 사용자의 값을 변경 하 여 Todoitem를 수정 하는 데 추가 코드를 작성 하지 않아도 속성이 창. 속성 창이 자동으로 호출 됩니다는 set 속성 접근자는 값을 업데이트할 수 있습니다. 그러나, ToDoItem 클래스의 코드를 작성 한 경우 사용자가 만든 UpdateList 메서드를 완료 해야 합니다.

  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 셸. 그런 다음 개체를 가져오려면 인스턴스를 사용을 속성 창입니다. 가져올 수 있는 속성 window 개체를 나타내는 GUID를 사용 하 여 코드가 시작 되는 속성 창. (구성원이 도구 창에 대 한 Guid는 ToolWindowGuids80 클래스입니다.) 코드 다음 얻을에 GUID를 전달 하 여 셸에서의 FindToolWindow 함수를 호출을 속성 window 개체입니다. 이렇게 저장 하면 프레임 변수를 함수를 얻는이 과정을 다시 호출 되도록 해당 속성 반복 하 창 없는.

    메서드 프레임 변수를 표시 하려면 Show 메서드를 호출 하는 다음으로 속성이 창입니다.

    다음 코드는 Listbox에서 선택한 항목을 수집합니다. 목록 상자 다중 선택 사용할 수 있도록 구성 되지 않았습니다. 선택한 항목을 전달 하는 속성 창에서 컨테이너를 사용 해야 합니다. 따라서 코드 선택된 항목 수집 및 Arraylist에 배치 고는 ArrayList SelectionContainer 형식의 컨테이너에서 전환 합니다.

    다음으로 코드에서는 GetService 인 Itrackselection의 인스턴스를 가져오기 위해 호출을 Visual Studio 선택 추적 개체 사용자 인터페이스 (UI)에서 개체 및 해당 속성을 표시 합니다. 다음 코드는 직접 ITrackSelection OnSelectChange 이벤트 처리기를 호출 하 고 선택한 항목을 보유 하 고 있는 SelectionContainer 전달 합니다. 따라서 해당 속성 선택한 항목에 대 한 속성 창에 표시 됩니다.

    사용자가 변경 되 면 ToDoItem 개체에는 속성 창의 속성 창이 자동으로 호출 하는 set 접근자 함수에서 ToDoItem 개체. 개체를 업데이트 했지만 목록 상자를 업데이트할 수 있습니다.

  13. 이전 단계에서 추가한 코드는 set 접근자 함수는 MyControl.xaml.cs 또는 Mycontrol.xaml.vb에서 UpdateList 함수를 호출 합니다. 이제 나머지 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에서 항목을 제거 하 고 해당 구역을. 이렇게 항목 목록 상자에서 행을 업데이트 합니다. 다음 코드는 선택 영역 같은 항목을 다시 설정합니다.

  15. 작업한 내용을 저장합니다.

텍스트 출력 창 및 항목을 작업 목록에 추가

문자열에 추가 하는 작업 목록출력 창에서 먼저 받을 이러한 두 개의 창에 참조 하는 개체입니다. 그런 다음 개체에서 메서드를 호출할 수 있습니다. 에 작업 목록, 작업 유형의 새 개체를 만들고 해당 작업 개체를 추가 작업 목록 의 Add 메서드를 호출 하 여. 쓰려고 하는 출력 창의 창 개체를 얻을 수는 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 인터페이스를 노출합니다. 코드 다음 궁극적으로 씁니다 OutputString 함수를 포함 하는 IVsOutputWindowPane 개체를 가져옵니다는 출력 창입니다.

  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. 두 개의 닫는 괄호 바로 앞에 클래스의 끝에 다음 코드를 추가 합니다.

    <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);
    }
    

    이 코드를 시작할 때 특수 TaskProvider 클래스 GUID를 포함 하는 MyTaskProvider 라고 합니다. 그런 다음 필요한 경우에 새 인스턴스를 만드는 방법으로 다음에이 형식의 새 클래스 멤버 변수가입니다.

    다음 두 가지 중요 한 방법, 기존 작업 항목을 지웁니다 ClearError, 및 항목을 추가 하는 ReportError 제공 되는 작업 목록.

    ReportError 메서드 작업의 새 인스턴스를 만들고 인스턴스를 초기화 한 다음 인스턴스를 추가 작업 목록. 새로운 작업 목록 항목 맨 위에 있는 드롭다운 목록에서 ToDo 항목 사용자를 선택 하면 표시 됩니다만 작업 목록. 마지막 두 줄의 코드에서 자동으로 드롭다운 목록에서 ToDo 항목을 선택 및 새 작업 항목 뷰에 표시 합니다. SetActiveProvider 메서드는 GUID 매개 변수로 필요 하므로 TaskProvider 클래스 상속 된 GUID입니다.

이 시도

확장을 테스트하려면

  1. 실험적인 빌드를 열려면 CTRL + f 5를 키를 눌러 Visual Studio.

  2. 실험적인 빌드에 도구 메뉴를 클릭 작업 관리자.

    디자인 도구 창이 열립니다.

  3. 텍스트 상자에 텍스트를 입력 하 고 다음을 클릭 추가.

    항목을 목록 상자에 추가 되었는지 표시 되어야 합니다.

  4. 다른 항목을 입력 한 다음 추가 다시.

    항목을 추가할 때 초기 날짜는 현재 날짜 및 시간으로 설정 됩니다. 이 오류 및 항목을 트리거하는 작업 목록.

  5. 보기 메뉴를 클릭 출력 열은 출력 창.

    매번 새 열 항목을 추가 하 고 메시지가 표시 되는 작업 목록 창입니다.

  6. 목록 상자에서 항목 중 하나를 클릭 합니다.

    속성이 항목에 대해 두 개의 속성 창에 표시 됩니다.

  7. 속성 중 하나를 변경 하 고 ENTER 키를 누릅니다.

    항목 목록 상자에서 업데이트 됩니다.

새로운 기능

이 연습에서 만든 다른 도구 창에 통합 된 도구 창의 Visual Studio. Visual Studio작업할 수 있는 여러 도구 창이 며 이들에 대 한 Guid를 찾을 수 있는 ToolWindowGuids 클래스입니다. 속성을 포함 하는 클래스도 생성 하는 속성 창을 액세스할 수 있습니다. 접근자 함수는 제공 되는 속성 창을 사용 하 여. 에 set 접근자 함수 호출에 대 한 변경 내용을 처리 하는 자체 코드에 있는 속성 창. 이 양방향 통신 메커니즘을 제공 합니다. 마지막으로 항목을 추가 하는 방법을 배웠습니다는 작업 목록, 보기에 항목을 표시 하는 방법 및 텍스트를 추가 하는 방법의 출력 창입니다.

참고 항목

개념

출력 창 (Visual Studio SDK)

작업 목록

기타 리소스

명령, 메뉴 및 도구 모음

도구 창

속성 창 및 속성 페이지