Share via


연습: Outlook에서 이메일 메시지와 함께 사용자 지정 작업창 표시

이 연습에서는 각 이메일 메시지를 만들거나 열 때 사용자 지정 작업창의 고유 인스턴스를 표시하는 방법을 보여 줍니다. 사용자는 각 메일 메시지의 리본에 있는 단추를 사용하여 사용자 지정 작업창을 표시하거나 숨길 수 있습니다.

적용 대상: 이 항목의 정보는 Outlook의 VSTO 추가 기능 프로젝트에 적용됩니다. 자세한 내용은 Office 애플리케이션 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하세요.

여러 탐색기 또는 검사기 창에서 사용자 지정 작업창을 함께 표시하려면 열리는 각 창에 대해 사용자 지정 작업창의 인스턴스를 만들어야 합니다. Outlook 창에서의 사용자 지정 작업창 동작에 대한 자세한 내용은 사용자 지정 작업창을 참조하세요.

참고 항목

이 연습에서는 코드에 숨겨진 논리를 보다 쉽게 설명하기 위해 VSTO 추가 기능 코드를 여러 개의 작은 섹션으로 보여 줍니다.

이 연습에서는 다음 작업을 수행합니다.

  • 사용자 지정 작업창의 UI(사용자 인터페이스) 디자인

  • 사용자 지정 리본 UI 만들기

  • 이메일 메시지와 함께 사용자 지정 리본 UI 표시

  • 검사기 창 및 사용자 지정 작업창을 관리하기 위한 클래스 만들기

  • VSTO 추가 기능에서 사용되는 리소스 초기화 및 정리

  • 리본 토글 단추를 사용자 지정 작업창과 동기화

참고 항목

일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 Visual Studio IDE 개인 설정을 참조하세요.

필수 조건

이 연습을 완료하려면 다음과 같은 구성 요소가 필요합니다.

프로젝트 만들기

사용자 지정 작업창은 VSTO 추가 기능에서 구현됩니다. 먼저 Outlook용 VSTO 추가 기능 프로젝트를 만듭니다.

새 프로젝트를 만들려면

  1. 이름이 OutlookMailItemTaskPaneOutlook 추가 기능프로젝트를 만듭니다. Outlook 추가 기능 프로젝트 템플릿을 사용합니다. 자세한 내용은 방법: Visual Studio에서 Office 프로젝트 만들기를 참조하세요.

    Visual Studio에서는 ThisAddIn.cs 또는 ThisAddIn.vb 코드 파일을 열고 OutlookMailItemTaskPane 프로젝트를 솔루션 탐색기에 추가합니다.

사용자 지정 작업창의 사용자 인터페이스 디자인

사용자 지정 작업창을 위한 비주얼 디자이너는 없지만 원하는 UI를 사용하여 사용자 정의 컨트롤을 디자인할 수 있습니다. 이 VSTO 추가 기능의 사용자 지정 작업창에는 TextBox 컨트롤이 포함된 간단한 UI가 있습니다. 이 연습 뒷부분에서는 사용자 지정 작업창에 사용자 정의 컨트롤을 추가합니다.

사용자 지정 작업창의 사용자 인터페이스를 디자인하려면

  1. 솔루션 탐색기에서 OutlookMailItemTaskPane 프로젝트를 클릭합니다.

  2. 프로젝트 메뉴에서 사용자 정의 컨트롤 추가를 클릭합니다.

  3. 새 항목 추가 대화 상자에서 새 사용자 정의 컨트롤의 이름을 TaskPaneControl로 변경하고 추가를 클릭합니다.

    사용자 정의 컨트롤이 디자이너에서 열립니다.

  4. 도구 상자공용 컨트롤탭에서 TextBox 컨트롤을 사용자 정의 컨트롤로 끌어 놓습니다.

리본의 사용자 인터페이스 디자인

이 VSTO 추가 기능의 목표 중 하나는 사용자가 각 이메일 메시지의 리본에서 사용자 지정 작업창을 숨기거나 표시할 수 있도록 하는 것입니다. 사용자 인터페이스를 제공하려면 사용자가 클릭하면 사용자 지정 작업창을 표시하거나 숨길 수 있는 토글 단추를 표시하는 사용자 지정 리본 UI를 만듭니다.

사용자 지정 리본 UI를 만들려면

  1. 프로젝트 메뉴에서 새 항목 추가를 클릭합니다.

  2. 새 항목 추가 대화 상자에서 리본(비주얼 디자이너)을 선택합니다.

  3. 새 리본의 이름을 ManageTaskPaneRibbon으로 변경하고 추가를 클릭합니다.

    ManageTaskPaneRibbon.cs 또는 ManageTaskPaneRibbon.vb 파일이 리본 디자이너에서 열리고 기본 탭 및 그룹이 표시됩니다.

  4. 리본 디자이너에서 group1을 클릭합니다.

  5. 속성 창에서 Label 속성을 작업창 관리자로 설정합니다.

  6. 도구 상자Office 리본 컨트롤탭에서 ToggleButton 컨트롤을 작업창 관리자 그룹으로 끌어 놓습니다.

  7. toggleButton1을 클릭합니다.

  8. 속성 창에서 Label 속성을 작업창 표시로 설정합니다.

이메일 메시지와 함께 사용자 지정 리본 사용자 인터페이스 표시

이 연습에서 만드는 사용자 지정 작업창은 메일 메시지가 포함된 검사기 창과 함께만 나타나도록 디자인되었습니다. 따라서 사용자 지정 리본 UI가 이 창과 함께만 표시되도록 해당 속성을 설정합니다.

이메일 메시지와 함께 사용자 지정 리본 UI를 표시하려면

  1. 리본 디자이너에서 ManageTaskPaneRibbon 리본을 클릭합니다.

  2. 속성 창에서 RibbonType옆의 드롭다운 목록을 클릭하고 Microsoft.Outlook.Mail.ComposeMicrosoft.Outlook.Mail.Read를 선택합니다.

검사기 창 및 사용자 지정 작업창을 관리하기 위한 클래스 만들기

VSTO 추가 기능에서 특정 이메일 메시지와 연결된 사용자 지정 작업창을 식별해야 하는 경우가 있습니다. 이러한 경우는 다음과 같습니다.

  • 사용자가 이메일 메시지를 닫은 경우 이 경우 VSTO 추가 기능에서는 VSTO 추가 기능이 사용한 리소스가 올바르게 정리되도록 해당 사용자 지정 작업창을 제거해야 합니다.

  • 사용자가 사용자 지정 작업창을 닫은 경우. 이 경우 VSTO 추가 기능에서는 이메일 메시지의 리본에 있는 토글 단추의 상태를 업데이트해야 합니다.

  • 사용자가 리본의 토글 단추를 클릭한 경우 이 경우 VSTO 추가 기능에서는 해당 작업창을 숨기거나 표시해야 합니다.

    VSTO 추가 기능에서 열려 있는 각 이메일 메시지와 연결된 사용자 지정 작업창을 추적할 수 있도록 하려면 InspectorCustomTaskPane 개체 쌍을 래핑하는 사용자 지정 클래스를 만듭니다. 이 클래스는 각 이메일 메시지에 대해 새 사용자 지정 작업창 개체를 만들고 해당 이메일 메시지가 닫히면 사용자 지정 작업창을 삭제합니다.

검사기 창 및 사용자 지정 작업창을 관리하기 위한 클래스를 만들려면

  1. 솔루션 탐색기에서 ThisAddIn.cs 또는 ThisAddIn.vb 파일을 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다.

  2. 파일 맨 위에 다음 문을 추가합니다.

    using Microsoft.Office.Tools;
    
  3. 다음 코드를 ThisAddIn.cs 또는 ThisAddIn.vb 파일의 ThisAddIn 클래스 외부에 추가합니다. Visual C#의 경우에는 이 코드를 OutlookMailItemTaskPane 네임스페이스 내에 추가합니다. InspectorWrapper 클래스는 InspectorCustomTaskPane 개체 쌍을 관리합니다. 다음 단계에서는 이 클래스의 정의를 완료합니다.

    public class InspectorWrapper
    {
        private Outlook.Inspector inspector;
        private CustomTaskPane taskPane;
    
  4. 이전 단계에서 추가한 코드 뒤에 다음 생성자를 추가합니다. 이 생성자는 전달된 Inspector 개체와 연결된 새 사용자 지정 작업창을 만들고 초기화합니다. C#에서는 이 생성자가 Close 개체의 Inspector 이벤트와 VisibleChanged 개체의 CustomTaskPane 이벤트에 이벤트 처리기를 연결합니다.

    public InspectorWrapper(Outlook.Inspector Inspector)
    {
        inspector = Inspector;
        ((Outlook.InspectorEvents_Event)inspector).Close +=
            new Outlook.InspectorEvents_CloseEventHandler(InspectorWrapper_Close);
        
        taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(
            new TaskPaneControl(), "My task pane", inspector);
        taskPane.VisibleChanged += new EventHandler(TaskPane_VisibleChanged);
    }
    
  5. 이전 단계에서 추가한 코드 뒤에 다음 메서드를 추가합니다. 이 메서드는 VisibleChanged 클래스에 포함된 CustomTaskPane 개체의 InspectorWrapper 이벤트에 대한 이벤트 처리기입니다. 이 코드는 사용자가 사용자 지정 작업창을 열거나 닫을 때마다 토글 단추의 상태를 업데이트합니다.

    void TaskPane_VisibleChanged(object sender, EventArgs e)
    {
        Globals.Ribbons[inspector].ManageTaskPaneRibbon.toggleButton1.Checked = 
            taskPane.Visible;
    }
    
  6. 이전 단계에서 추가한 코드 뒤에 다음 메서드를 추가합니다. 이 메서드는 현재 이메일 메시지가 포함된 Inspector 개체의 Close 이벤트에 대한 이벤트 처리기입니다. 이벤트 처리기에서는 이메일 메시지가 닫힐 때 리소스를 해제합니다. 또한 CustomTaskPanes 컬렉션에서 현재 사용자 지정 작업창을 제거합니다. 이렇게 하면 다음 이메일 메시지가 열릴 때 사용자 지정 작업창의 인스턴스가 여러 개가 되지 않습니다.

    void InspectorWrapper_Close()
    {
        if (taskPane != null)
        {
            Globals.ThisAddIn.CustomTaskPanes.Remove(taskPane);
        }
    
        taskPane = null;
        Globals.ThisAddIn.InspectorWrappers.Remove(inspector);
        ((Outlook.InspectorEvents_Event)inspector).Close -=
            new Outlook.InspectorEvents_CloseEventHandler(InspectorWrapper_Close);
        inspector = null;
    }
    
  7. 이전 단계에서 추가한 코드 뒤에 다음 코드를 추가합니다. 이 연습의 뒷부분에서는 사용자 지정 리본 UI의 메서드에서 이 속성을 호출하여 사용자 지정 작업창을 표시하거나 숨깁니다.

        public CustomTaskPane CustomTaskPane
        {
            get
            {
                return taskPane;
            }
        }
    }
    

추가 기능에서 사용되는 리소스 초기화 및 정리

ThisAddIn 클래스에 코드를 추가하여 VSTO 추가 기능이 로드될 때 VSTO 추가 기능을 초기화하고 VSTO 추가 기능이 언로드될 때 VSTO 추가 기능에서 사용하는 리소스를 정리할 수 있습니다. NewInspector 이벤트에 대한 이벤트 처리기를 설정하고 기존의 모든 이메일 메시지를 이 이벤트 처리기에 전달하여 VSTO 추가 기능을 초기화합니다. VSTO 추가 기능이 언로드될 때는 이벤트 처리기를 분리하고 VSTO 추가 기능에서 사용한 개체를 정리합니다.

VSTO 추가 기능에서 사용되는 리소스를 초기화하고 정리하려면

  1. ThisAddIn.cs 또는 ThisAddIn.vb 파일에서 ThisAddIn 클래스의 정의를 찾습니다.

  2. ThisAddIn 클래스에 다음 선언을 추가합니다.

    • inspectorWrappersValue 필드에는 VSTO 추가 기능에서 관리되는 모든 InspectorInspectorWrapper 개체가 포함됩니다.

    • inspectors 필드는 현재 Outlook 인스턴스의 검사기 창 컬렉션에 대한 참조를 유지 관리합니다. 이 참조는 가비지 수집기가 NewInspector 이벤트(다음 단계에서 선언)에 대한 이벤트 처리기가 포함된 메모리를 해제할 수 없게 합니다.

      private Dictionary<Outlook.Inspector, InspectorWrapper> inspectorWrappersValue =
          new Dictionary<Outlook.Inspector, InspectorWrapper>();
      private Outlook.Inspectors inspectors;
      

  3. ThisAddIn_Startup 메서드를 다음 코드로 바꿉니다. 이 코드에서 NewInspector 이벤트에 이벤트 처리기를 연결하고 기존의 모든 Inspector 개체를 이벤트 처리기에 전달합니다. Outlook이 이미 실행 중일 때 사용자가 VSTO 추가 기능을 로드하면 VSTO 추가 기능에서는 이 정보를 사용하여 이미 열려 있는 모든 이메일 메시지에 대해 사용자 지정 작업창을 만듭니다.

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        inspectors = this.Application.Inspectors;
        inspectors.NewInspector +=
            new Outlook.InspectorsEvents_NewInspectorEventHandler(
            Inspectors_NewInspector);
    
        foreach (Outlook.Inspector inspector in inspectors)
        {
            Inspectors_NewInspector(inspector);
        }
    }
    
  4. ThisAddIn_ShutDown 메서드를 다음 코드로 바꿉니다. 이 코드에서는 NewInspector 이벤트 처리기를 분리하고 VSTO 추가 기능에서 사용한 개체를 정리합니다.

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        inspectors.NewInspector -=
            new Outlook.InspectorsEvents_NewInspectorEventHandler(
            Inspectors_NewInspector);
        inspectors = null;
        inspectorWrappersValue = null;
    }
    
  5. NewInspector 클래스에 다음 ThisAddIn 이벤트 처리기를 추가합니다. 새 Inspector에 이메일 메시지가 포함되어 있는 경우 이 메서드에서 새 InspectorWrapper 개체의 인스턴스를 만들어 이메일 메시지와 해당 작업창 간의 관계를 관리합니다.

    void Inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        if (Inspector.CurrentItem is Outlook.MailItem)
        {
            inspectorWrappersValue.Add(Inspector, new InspectorWrapper(Inspector));
        }
    }
    
  6. 다음 속성을 ThisAddIn 클래스에 추가합니다. 이 속성은 inspectorWrappersValue 클래스 외부의 코드에 전용 ThisAddIn 필드를 노출합니다.

    public Dictionary<Outlook.Inspector, InspectorWrapper> InspectorWrappers
    {
        get
        {
            return inspectorWrappersValue;
        }
    }
    

검사점

프로젝트를 빌드하여 프로젝트가 오류 없이 컴파일되는지 확인합니다.

프로젝트를 빌드하려면

  1. 솔루션 탐색기에서 OutlookMailItemTaskPane 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 빌드를 클릭합니다. 프로젝트가 오류 없이 컴파일되는지 확인합니다.

리본 토글 단추를 사용자 지정 작업창과 동기화

토글 단추는 작업창이 표시될 때 누른 상태로 표시되고 작업창이 숨겨져 있을 때는 누르지 않은 상태로 표시됩니다. 단추의 상태를 사용자 지정 작업창과 동기화하려면 토글 단추의 Click 이벤트 처리기를 수정합니다.

사용자 지정 작업창을 토글 단추와 동기화하려면

  1. 리본 디자이너에서 작업창 표시 토글 단추를 두 번 클릭합니다.

    Visual Studio에서 이 토글 단추의 toggleButton1_Click이벤트를 처리하는 Click 이라는 이벤트 처리기가 자동으로 생성됩니다. 또한 ManageTaskPaneRibbon.cs 또는 ManageTaskPaneRibbon.vb 파일이 코드 편집기에서 열립니다.

  2. ManageTaskPaneRibbon.cs 또는 ManageTaskPaneRibbon.vb 파일 맨 위에 다음 문을 추가합니다.

    using Outlook = Microsoft.Office.Interop.Outlook;
    using Microsoft.Office.Tools;
    
  3. toggleButton1_Click 이벤트 처리기를 다음 코드로 바꿉니다. 사용자가 토글 단추를 클릭하면 이 메서드는 현재 검사기 창과 연결된 사용자 지정 작업창을 숨기거나 표시합니다.

    private void toggleButton1_Click(object sender, RibbonControlEventArgs e)
    {
        Outlook.Inspector inspector = (Outlook.Inspector)e.Control.Context;
        InspectorWrapper inspectorWrapper = Globals.ThisAddIn.InspectorWrappers[inspector];
        CustomTaskPane taskPane = inspectorWrapper.CustomTaskPane;
        if (taskPane != null)
        {
            taskPane.Visible = ((RibbonToggleButton)sender).Checked;
        }
    }
    

프로젝트 테스트

프로젝트를 디버깅하면 Outlook이 열리고 VSTO 추가 기능이 로드됩니다. VSTO 추가 기능에서는 열려 있는 각 이메일 메시지와 함께 사용자 지정 작업창의 고유 인스턴스를 표시합니다. 여러 개의 새 이메일 메시지를 만들어 코드를 테스트합니다.

VSTO 추가 기능을 테스트하려면

  1. F5키를 누릅니다.

  2. Outlook에서 새로 만들기를 클릭하여 새 이메일 메시지를 만듭니다.

  3. 이메일 메시지의 리본에서 추가 기능 탭을 클릭한 다음, 작업창 표시 단추를 클릭합니다.

    내 작업창이라는 제목의 작업창이 이메일 메시지와 함께 표시되는지 확인합니다.

  4. 작업창의 텍스트 상자에 첫 번째 작업창 을 입력합니다.

  5. 작업 창을 닫습니다.

    작업창 표시 단추의 상태가 누르지 않은 상태로 변경되는지 확인합니다.

  6. 작업창 표시 단추를 다시 클릭합니다.

    작업창이 열리고 텍스트 상자에 여전히 첫 번째 작업창이라는 문자열이 들어 있는지 확인합니다.

  7. Outlook에서 새로 만들기를 클릭하여 두 번째 이메일 메시지를 만듭니다.

  8. 이메일 메시지의 리본에서 추가 기능 탭을 클릭한 다음, 작업창 표시 단추를 클릭합니다.

    내 작업창이라는 제목의 작업창이 이메일 메시지와 함께 표시되고 이 작업창의 텍스트 상자가 비어 있는지 확인합니다.

  9. 작업창의 텍스트 상자에 두 번째 작업창 을 입력합니다.

  10. 포커스를 첫 번째 이메일 메시지로 이동합니다.

    이 이메일 메시지와 연결된 작업창의 텍스트 상자에 여전히 첫 번째 작업창이 표시되는지 확인합니다.

    이 VSTO 추가 기능에서는 보다 고급 시나리오도 처리하며 이를 테스트해 볼 수도 있습니다. 예를 들어 다음 항목이전 항목 단추를 사용하여 이메일을 볼 때의 동작을 테스트할 수 있습니다. VSTO 추가 기능을 언로드하고 여러 개의 이메일 메시지를 연 다음, VSTO 추가 기능을 다시 로드할 때의 동작을 테스트할 수도 있습니다.

다음 단계

다음 항목에서는 사용자 지정 작업창을 만드는 방법에 대해 더 자세히 설명합니다.