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


Пошаговое руководство. Отображение в Outlook настраиваемых областей задач с сообщениями электронной почты

Обновлен: Ноябрь 2007

Применение

Сведения в данном разделе относятся только к указанным проектам Visual Studio Tools for Office и версиям приложений Microsoft Office.

Тип проекта

  • Проекты уровня приложения

Приложение Microsoft Office

  • Outlook 2007

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

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

Чтобы отобразить настраиваемую область задач с несколькими окнами проводника или инспектора, необходимо создать экземпляр настраиваемой области задач для каждого открытого окна. Дополнительные сведения о поведении настраиваемых областей задач в окнах Outlook см. в разделе Общие сведения о настраиваемых областях задач.

Bb296010.alert_note(ru-ru,VS.90).gifПримечание.

Код надстройки, представленный в этом пошаговом руководстве, разделен на небольшие фрагменты для облегчения рассмотрения его работы. Чтобы просмотреть целиком содержание всех файлов, редактируемых в этом руководстве, см. раздел Практическое руководство. Отображение настраиваемых областей задач с сообщениями электронной почты в Outlook.

В данном пошаговом руководстве представлены следующие задачи.

  • Проектирование пользовательского интерфейса настраиваемой области задач.

  • Создание пользовательского интерфейса ленты.

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

  • Создание класса для управления окнами инспектора и настраиваемыми областями задач.

  • Инициализация и освобождение ресурсов, используемых надстройкой.

  • Синхронизация выключателя на ленте с настраиваемой областью задач.

Bb296010.alert_note(ru-ru,VS.90).gifПримечание.

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

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

Для выполнения инструкций данного пошагового руководства необходимы следующие компоненты:

  • Visual Studio Tools for Office (необязательный компонент Visual Studio 2008 Professional и Visual Studio Team System).

  • Microsoft Office Outlook 2007.

Visual Studio Tools for Office устанавливается по умолчанию с перечисленными версиями Visual Studio. Чтобы проверить, установлен ли данный набор средств, см. раздел Установка средств Visual Studio для Office.

Создание проекта

Настраиваемые области задач реализуются в надстройках уровня приложения. Начните с создания проекта надстройки для Outlook 2007.

Создание нового проекта

  • Создайте проект Надстройка Outlook с именем OutlookMailItemTaskPane. Воспользуйтесь шаблоном проекта Надстройка Outlook в выпуске 2007 системы Microsoft Office. Дополнительные сведения см. в разделе Практическое руководство. Создание проектов Visual Studio Tools for Office.

    Visual Studio откроет файл с исходным кодом ThisAddIn.cs или ThisAddIn.vb и добавит проект OutlookMailItemTaskPane в Обозреватель решений.

Проектирование пользовательского интерфейса настраиваемой области задач

Визуального конструктора для настраиваемых областей задач нет, но можно разработать собственный элемент управления с требуемым пользовательским интерфейсом. Настраиваемая область задач в этой надстройке имеет простой пользовательский интерфейс, содержащий элемент управления TextBox. Позднее в этом руководстве мы добавим пользовательский элемент управления к настраиваемой области задач.

Проектирование пользовательского интерфейса настраиваемой области задач

  1. В Обозревателе решений щелкните проект OutlookMailItemTaskPane.

  2. В меню Проект выберите команду Добавить пользовательский элемент управления.

  3. В диалоговом окне Добавление нового элемента измените имя пользовательского элемента управления на TaskPaneControl и нажмите кнопку Добавить.

    В конструкторе откроется указанный пользовательский элемент управления.

  4. Перетащите со вкладки Общие элементы управленияПанели элементов элемент управления TextBox на пользовательский элемент управления.

Проектирование пользовательского интерфейса ленты

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

Создание пользовательского интерфейса ленты

  1. В меню Проект выберите команду Добавить новый элемент.

  2. В диалоговом окне Добавление нового элемента выберите Лента (визуальный конструктор).

  3. Измените имя новой ленты на ManageTaskPaneRibbon и нажмите кнопку Добавить.

    В конструкторе лент откроется файл ManageTaskPaneRibbon.cs или ManageTaskPaneRibbon.vb и отобразятся вкладка по умолчанию и группа.

  4. В конструкторе лент щелкните группу group1.

  5. В окне Свойства присвойте свойству Label значение Диспетчер области задач.

  6. Перетащите элемент управления ToggleButton с вкладки Элементы управления ленты OfficeПанели элементов в группу Диспетчер области задач.

  7. Щелкните выключатель toggleButton1.

  8. В окне Свойства присвойте свойству Label значение Показать область задач.

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

Настраиваемая область задач, создание которой рассматривается в данном пошаговом руководстве, должна появляться только с окнами инспектора, содержащими сообщения электронной почты. Поэтому необходимо установить свойства для отображения пользовательского интерфейса ленты только с этими окнами.

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

  1. В конструкторе лент щелкните ленту ManageTaskPaneRibbon.

  2. В окне Свойства рядом с RibbonType щелкните раскрывающийся список и выберите Microsoft.Outlook.Mail.Compose и Microsoft.Outlook.Mail.Read.

Создание класса для управления окнами инспектора и настраиваемыми областями задач

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

  • Пользователь закрывает сообщение электронной почты. В этом случае надстройка, чтобы освободить используемые ресурсы, должна удалить соответствующую настраиваемую область задач.

  • Пользователь закрывает настраиваемую область задач. В этом случае надстройка должна обновить состояние выключателя на ленте электронной почты.

  • Пользователь щелкает на ленте выключатель. В этом случае надстройка должна показать или скрыть соответствующую область задач.

Чтобы надстройка смогла отслеживать, какая из настраиваемых областей задач связана с данным открытым сообщением электронной почты, создадим пользовательский класс, который будет оболочкой для пар объектов Inspector и CustomTaskPane. Этот класс создает новый объект настраиваемой области задач для каждого сообщения электронной почты и удаляет настраиваемую область задач при закрытии соответствующего сообщения электронной почты.

Создание класса для управления окнами инспектора и настраиваемыми областями задач

  1. В Обозревателе решений щелкните правой кнопкой мыши файл ThisAddIn.cs или ThisAddIn.vb и выберите в контекстном меню команду Просмотреть код.

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

    Imports System.Collections.Generic
    Imports Microsoft.Office.Tools
    Imports Office = Microsoft.Office.Core
    Imports Outlook = Microsoft.Office.Interop.Outlook
    
    using Microsoft.Office.Tools;
    
  3. Следующий код добавьте в файл ThisAddIn.cs или ThisAddIn.vb вне класса ThisAddIn (для Visual C# добавьте этот код внутри пространства имен OutlookMailItemTaskPane). Класс InspectorWrapper управляет одной парой объектов Inspector и CustomTaskPane. Завершите определение этого класса следующими действиями.

    Public Class InspectorWrapper
        Private inspector As Outlook.Inspector
        Private WithEvents inspectorEvents As Outlook.InspectorEvents_Event
        Private WithEvents taskPane As CustomTaskPane
    
    public class InspectorWrapper
    {
        private Outlook.Inspector inspector;
        private CustomTaskPane taskPane;
    
  4. Добавьте следующий конструктор после кода, созданного на предыдущем шаге. Этот конструктор создает и инициализирует новую настраиваемую область задач, которая связывается с передаваемым объектом Inspector. В C# конструктор также присоединяет обработчики событий к событию Close объекта Inspector и событию VisibleChanged объекта CustomTaskPane.

    Public Sub New(ByVal Inspector As Outlook.Inspector)
        Me.inspector = Inspector
        inspectorEvents = TryCast(Me.inspector, Outlook.InspectorEvents_Event)
        taskPane = Globals.ThisAddIn.CustomTaskPanes.Add(New TaskPaneControl(), _
            "My task pane", Inspector)
    End Sub
    
    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. Этот код обновляет состояние выключателя всякий раз, когда пользователь открывает или закрывает настраиваемую область задач.

    Private Sub TaskPane_VisibleChanged(ByVal sender As Object, ByVal e As EventArgs) _
        Handles taskPane.VisibleChanged
        Globals.Ribbons(inspector).ManageTaskPaneRibbon.ToggleButton1.Checked = taskPane.Visible
    End Sub
    
    void TaskPane_VisibleChanged(object sender, EventArgs e)
    {
        Globals.Ribbons[inspector].ManageTaskPaneRibbon.toggleButton1.Checked = 
            taskPane.Visible;
    }
    
  6. Добавьте следующий метод после кода, созданного на предыдущем шаге. Этот метод является обработчиком событий Close объекта Inspector, который содержит текущее сообщение электронной почты. Обработчик событий освободит ресурсы при закрытии сообщения электронной почты. Обработчик событий также удаляет из коллекции CustomTaskPanes текущую настраиваемую область задач. Это позволяет предотвратить создание нескольких экземпляров настраиваемой области задач при открытии следующего сообщения электронной почты.

    Sub InspectorWrapper_Close() Handles inspectorEvents.Close
        If Not (taskPane Is Nothing) Then
            Globals.ThisAddIn.CustomTaskPanes.Remove(taskPane)
        End If
    
        taskPane = Nothing
        Globals.ThisAddIn.InspectorWrappers.Remove(inspector)
        RemoveHandler inspectorEvents.Close, AddressOf InspectorWrapper_Close
        inspector = Nothing
    End Sub
    
    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. Добавьте следующий код после кода, созданного на предыдущем шаге. Позднее мы обратимся к этому свойству из метода пользовательского интерфейса ленты для отображения или скрытия настраиваемой области задач.

        Public ReadOnly Property CustomTaskPane() As CustomTaskPane
            Get
                Return taskPane
            End Get
        End Property
    End Class
    
        public CustomTaskPane CustomTaskPane
        {
            get
            {
                return taskPane;
            }
        }
    }
    

Инициализация и освобождение ресурсов, используемых надстройкой

Для инициализации надстройки при ее загрузке и освобождении ресурсов при выгрузке добавьте код в класс ThisAddIn. Надстройка инициализируется путем установки обработчика событий для события NewInspector. Все уже существующие сообщения электронной почты будут переданы этому обработчику событий. При выгрузке надстройки отсоедините обработчик событий и освободите объекты, используемые надстройкой.

Инициализация и освобождение ресурсов, используемых надстройкой

  1. В файле ThisAddIn.cs или ThisAddIn.vb перейдите к определению класса ThisAddIn.

  2. Добавьте в класс ThisAddIn следующие объявления.

    • Поле inspectorWrappersValue содержит все объекты Inspector и InspectorWrapper, которыми управляет надстройка.

    • Поле inspectors содержит ссылку на коллекцию окон инспектора в текущем экземпляре Outlook. Эта ссылка не позволит сборщику мусора освободить память, содержащую обработчик событий NewInspector, который будет добавлен на следующем шаге.

    Private inspectorWrappersValue As New Dictionary(Of Outlook.Inspector, InspectorWrapper)
    Private WithEvents inspectors As Outlook.Inspectors
    
    private Dictionary<Outlook.Inspector, InspectorWrapper> inspectorWrappersValue =
        new Dictionary<Outlook.Inspector, InspectorWrapper>();
    private Outlook.Inspectors inspectors;
    
  3. Замените метод ThisAddIn_Startup следующим кодом. Этот код присоединяет обработчик событий к событию NewInspector. Все уже существующие объекты Inspector будут переданы этому обработчику. Если пользователь загружает надстройку после запуска Outlook, надстройка использует эту информацию для создания настраиваемых областей задач для всех уже открытых электронных сообщений.

    Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Startup
    
        inspectors = Me.Application.Inspectors
        Dim inspector As Outlook.Inspector
        For Each inspector In inspectors
            Inspectors_NewInspector(inspector)
        Next inspector
    End Sub
    
    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 и освобождает объекты, используемые надстройкой.

    Private Sub ThisAddIn_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Shutdown
    
        RemoveHandler inspectors.NewInspector, AddressOf Inspectors_NewInspector
        inspectors = Nothing
        inspectorWrappersValue = Nothing
    End Sub
    
    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 для управления связью между сообщением электронной почты и соответствующей областью задач.

    Sub Inspectors_NewInspector(ByVal Inspector As Outlook.Inspector) _
        Handles inspectors.NewInspector
    
        If TypeOf Inspector.CurrentItem Is Outlook.MailItem Then
            inspectorWrappersValue.Add(Inspector, New InspectorWrapper(Inspector))
        End If
    End Sub
    
    void Inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        if (Inspector.CurrentItem is Outlook.MailItem)
        {
            inspectorWrappersValue.Add(Inspector, new InspectorWrapper(Inspector));
        }
    }
    
  6. Добавьте в класс ThisAddIn следующее свойство. Оно предоставит доступ к закрытому полю inspectorWrappersValue вне класса ThisAddIn.

    Public ReadOnly Property InspectorWrappers() As Dictionary(Of Outlook.Inspector, InspectorWrapper)
        Get
            Return inspectorWrappersValue
        End Get
    End Property
    
    public Dictionary<Outlook.Inspector, InspectorWrapper> InspectorWrappers
    {
        get
        {
            return inspectorWrappersValue;
        }
    }
    

Контрольная точка

Постройте проект, чтобы убедиться, что он компилируется без ошибок.

Построение проекта

  • В Обозревателе решений щелкните правой кнопкой мыши проект OutlookMailItemTaskPane и выберите Построить. Убедитесь, что проект компилируется без ошибок.

Синхронизация выключателя на ленте с настраиваемой областью задач

Выключатель должен отображаться нажатым, когда область задач видима и не нажатым, когда область задач скрыта. Чтобы синхронизировать состояние выключателя с настраиваемой областью задач, модифицируйте его обработчик событий Click.

Синхронизация настраиваемой области задач с выключателем

  1. В конструкторе лент дважды щелкните выключатель Показать область задач.

    Visual Studio Tools for Office автоматически создаст обработчик событий с именем toggleButton1_Click, который будет обрабатывать событие Click выключателя. Visual Studio Tools for Office также откроет в редакторе кода файл ManageTaskPaneRibbon.cs или ManageTaskPaneRibbon.vb.

  2. Добавьте следующие инструкции в начало файла ManageTaskPaneRibbon.cs или ManageTaskPaneRibbon.vb.

    Imports Microsoft.Office.Tools.Ribbon
    Imports Outlook = Microsoft.Office.Interop.Outlook
    Imports Microsoft.Office.Tools
    
    using Outlook = Microsoft.Office.Interop.Outlook;
    using Microsoft.Office.Tools;
    
  3. Замените обработчик событий toggleButton1_Click следующим кодом. Когда пользователь нажимает выключатель, этот метод скрывает или показывает настраиваемую область задач, связанную с текущим окном инспектора.

    Private Sub ToggleButton1_Click(ByVal sender As System.Object, _
        ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _
        Handles ToggleButton1.Click
    
        Dim inspector As Outlook.Inspector = e.Control.Context
        Dim inspectorWrapper As InspectorWrapper = Globals.ThisAddIn.InspectorWrappers(inspector)
        Dim taskPane As CustomTaskPane = inspectorWrapper.CustomTaskPane
        If Not (taskPane Is Nothing) Then
            taskPane.Visible = TryCast(sender, RibbonToggleButton).Checked
        End If
    End Sub
    
    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 и загрузится надстройка. С каждым открытым электронным сообщением надстройка отображает уникальный экземпляр настраиваемой области задач. Создайте несколько новых сообщений электронной почты для проверки кода.

Проверка надстройки

  1. Нажмите клавишу F5.

  2. Для создания нового сообщения электронной почты в Outlook щелкните Создать.

  3. На ленте сообщения электронной почты перейдите на вкладку Надстройка и нажмите кнопку Показать область задач.

    Убедитесь, что с сообщением электронной почты отображается область задач с заголовком My task pane.

  4. В области задач введите в текстовое поле Первая область задач.

  5. Закройте область задач.

    Убедитесь, что состояние кнопки Показать область задач изменилось — она уже не нажата.

  6. Нажмите кнопку Показать область задач еще раз.

    Убедитесь, что область задач открывается и текстовое поле по-прежнему содержит строку Первая область задач.

  7. Для создания второго сообщения электронной почты в Outlook щелкните Создать.

  8. На ленте сообщения электронной почты перейдите на вкладку Надстройка и нажмите кнопку Показать область задач.

    Убедитесь, что с сообщением электронной почты отображается область задач с заголовком My task pane и текстовое поле в этой области задач пусто.

  9. В области задач введите в текстовое поле Вторая область задач.

  10. Перейдите к первому сообщению электронной почты.

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

Эта надстройка должна работать и в более сложных сценариях. Например, можно проверить работу кода при просмотре сообщений электронной почты с помощью кнопок Далее и Назад. Или выгрузить надстройку, открыть несколько сообщений электронной почты, а затем вновь ее загрузить.

Следующие действия

Дополнительные сведения о создании настраиваемых областей задач см. в следующих разделах.

См. также

Задачи

Практическое руководство. Добавление настраиваемой панели задач в приложение

Руководство. Автоматизация приложения в настраиваемой области задач

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

Практическое руководство. Отображение настраиваемых областей задач с сообщениями электронной почты в Outlook

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

Общие сведения о настраиваемых областях задач

Управление настраиваемыми областями задач в нескольких окнах приложений

Обзор ленты

Общие сведения об объектной модели Outlook

Доступ к ленте во время выполнения