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


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

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

Пример

Примечание.

Приведенный ниже пример кода представляет собой фрагмент из книги Программирование приложений для Microsoft Office Outlook 2007.

В следующих двух примерах кода реализованы классы Connect и OutlookInspector. В первом примере кода задействуются методы и обработчики событий, включенные в класс Connect для реализации оболочки коллекции Inspectors. Второй пример кода показывает простую реализацию класса OutlookInspector.

Если вы используете Visual Studio для тестирования этого примера кода, сначала добавьте ссылку на компонент Microsoft Outlook 15.0 Object Library и задайте переменную Outlook при импорте пространства имен Microsoft.Office.Interop.Outlook. Инструкция using не должна находиться непосредственно перед функциями в примере кода, но ее нужно добавить перед объявлением общедоступного класса. В следующей строке кода показано, как выполнить импорт и назначение в C#.

using Outlook = Microsoft.Office.Interop.Outlook;

В представленном ниже примере кода NewInspector(Inspector) событие возникает после создания нового окна инспектора и перед его отображением. Действием пользователя также можно создать новое окно инспектора. В классе Connect объявлена переменная экземпляра уровня класса с именем inspectors, и обрабатывается событие NewInspector.

В методе inspectors_NewInspector метод FindOutlookInspector проверяет, находится ли новое окно инспектора в списке inspectorWindows. Если FindOutlookInspector не может найти объект Inspector в inspectorWindows, метод AddInspector добавляет экземпляр класса OutlookInspector в список inspectorWindows. Класс OutlookInspector можно использовать, чтобы создать события для этого конкретного окна инспектора. Реализация класса OutlookInspector показана во втором примере кода.

class Connect
{
    // Connect class-level Instance Variables
    // Outlook inspectors collection
    private Outlook.Inspectors inspectors;

    // Collection of tracked inspector windows              
    private List<OutlookInspector> inspectorWindows;   
    
    public Connect(Outlook.Inspectors Inspectors)
    {
        inspectors = Inspectors;
        inspectorWindows = new List<OutlookInspector>();
        // Hook up NewInspector event
        inspectors.NewInspector += new 
            Outlook.InspectorsEvents_NewInspectorEventHandler(
                inspectors_NewInspector);
    }

    // NewInspector event creates new instance of OutlookInspector
    void inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        // Check to see if this is a new window you don't
        // already track
        OutlookInspector existingWindow = 
            FindOutlookInspector(Inspector);
        if (existingWindow == null)
        {
            AddInspector(Inspector);
        }
    }

    // Adds an instance of **OutlookInspector** class
    private void AddInspector(Outlook.Inspector inspector)
    {
        OutlookInspector window = new OutlookInspector(inspector);
        window.Close +=
            new EventHandler(WrappedInspectorWindow_Close);
    }

    // Looks up the window wrapper for a given Inspector 
    // window object
    private OutlookInspector FindOutlookInspector(object window)
    {
        foreach (OutlookInspector inspector in inspectorWindows)
        {
            if (inspector.Window == window)
            {
                return inspector;
            }
        }
        return null;
    }
}

Следующий пример кода является реализацией класса OutlookInspector. Этот класс используется, чтобы создавать события для окна инспектора из предыдущего примера кода. Одновременно можно открыть несколько окон инспекторов. События уровня элемента, такие как Open, PropertyChange и CustomPropertyChange, отслеживаются с помощью обработчиков, задаваемых в конструкторе этого класса. Событие Close для объекта ContactItem также обрабатывается в конструкторе этого класса. При необходимости можно задать другие переменные экземпляра элемента уровня класса. Все события, которые были подключены в конструкторе OutlookInspector, отключены в обработчике событий OutlookInspectorWindow_Close.

Обратите внимание, что на уровне объектной модели объект Outlook inspector не относится к какому-либо элементу Outlook. В этом примере кода используется вспомогательный класс OutlookItem, определенный в статье Создание вспомогательного класса для доступа к распространенным элементам Outlook, чтобы легко вызывать свойство OutlookItem.Class для проверки класса сообщений текущего элемента в инспекторе до предположения, что элемент является элементом контактов.

// This class tracks the state of an Outlook Inspector window 
// and ensures that what happens in this window is handled correctly.
class OutlookInspector
{
    // OutlookInspector class-level instance variables 
    // wrapped window object
    private Outlook.Inspector m_Window;             

    // Use these instance variables to handle item-level events
    // wrapped MailItem
    private Outlook.MailItem m_Mail;    
    // wrapped AppointmentItem        
    private Outlook.AppointmentItem m_Appointment;  
    // wrapped ContactItem
    private Outlook.ContactItem m_Contact;
    // wrapped TaskItem      
    private Outlook.TaskItem m_Task;             

    // OutlookInspector constructor
    public OutlookInspector(Outlook.Inspector inspector)
    {
        m_Window = inspector;

        // Hook up the close event
        ((Outlook.InspectorEvents_Event)inspector).Close +=
            new Outlook.InspectorEvents_CloseEventHandler(
            OutlookInspectorWindow_Close);

        // Hook up item-level events as needed
        OutlookItem olItem = new OutlookItem(inspector.CurrentItem);
        if(olItem.Class==Outlook.OlObjectClass.olContact)
        {
            m_Contact = olItem.InnerObject as Outlook.ContactItem;
            m_Contact.Open +=
                new Outlook.ItemEvents_10_OpenEventHandler(
                m_Contact_Open);
            m_Contact.PropertyChange +=
                new Outlook.ItemEvents_10_PropertyChangeEventHandler(
                m_Contact_PropertyChange);
            m_Contact.CustomPropertyChange +=
                new Outlook.ItemEvents_10_CustomPropertyChangeEventHandler(
                m_Contact_CustomPropertyChange);
        }
    }

    // Event Handler for the inspector close event.
    private void OutlookInspectorWindow_Close()
    {
        // Unhook events from any item-level instance variables
        m_Contact.Open -= 
            Outlook.ItemEvents_10_OpenEventHandler(
            m_Contact_Open);
        m_Contact.PropertyChange -= 
            Outlook.ItemEvents_10_PropertyChangeEventHandler(
            m_Contact_PropertyChange);
        m_Contact.CustomPropertyChange -= 
            Outlook.ItemEvents_10_CustomPropertyChangeEventHandler(
            m_Contact_CustomPropertyChange);
        ((Outlook.ItemEvents_Event)m_Contact).Close -= 
            Outlook.ItemEvents_CloseEventHandler(
            m_Contact_Close);

        // Unhook events from the window
        ((Outlook.InspectorEvents_Event)m_Window).Close -=
            new Outlook.InspectorEvents_CloseEventHandler(
            OutlookInspectorWindow_Close);

        // Raise the OutlookInspector close event
        if (Close != null)
        {
            Close(this, EventArgs.Empty);
        }
        // Release item-level instance variables
        m_Mail = null;
        m_Appointment = null;
        m_Contact = null;
        m_Task = null;
        m_Window = null;
    }
}

См. также