为检查器实现包装器并在每个检查器中跟踪项级事件
此主题包含两个代码示例,用来演示如何实现 Inspectors 集合的包装,以及如何使用该包装跟踪集合中每个 Inspector 对象中的项目级事件。
示例
注意
下面的代码示例摘录自 Microsoft Office Outlook 2007 应用程序编程。
下面的两个代码示例实现了 Connect 及 OutlookInspector 类。 第一个代码示例涉及你在 Connect 类中用来实现 Inspectors 集合包装的方法和事件处理程序。 第二个代码示例涉及 OutlookInspector 类的一个简单实现。
如果使用 Visual Studio 测试此代码示例,必须先添加对 Microsoft Outlook 15.0 对象库组件的引用,并在导入 Microsoft.Office.Interop.Outlook 命名空间时指定 Outlook 变量。 不得将 using 语句直接添加到此代码示例中的函数前面,这个语句必须后跟公共类声明。 下面的代码行演示了如何在 C# 中执行导入和分配。
using Outlook = Microsoft.Office.Interop.Outlook;
在以下的代码示例中,在新检查器窗口创建之后、显示之前会发生 NewInspector(Inspector) 事件。 用户操作也可以创建新的检查器窗口。 系统会声明 Connect 类中一个名为 inspectors 的类级实例变量,还将挂起 NewInspector 事件。
在 inspectors_NewInspector 方法中, FindOutlookInspector 方法检查新检查器窗口是否已在 inspectorWindows 列表中。 如果 FindOutlookInspector 没有在 inspectorWindows 中找到 Inspector 对象,AddInspector 方法会向 inspectorWindows 添加 OutlookInspector 类的一个实例。 可以使用 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 等),可跟踪这些事件。 ContactItem 对象的 Close 事件也可在此类构造函数中挂起。 你可以根据需要定义其他类级别的项目实例变量。 在 OutlookInspector 构造函数中挂钩的所有事件在 OutlookInspectorWindow_Close 事件处理程序中已取消挂钩。
请注意,在对象模型级别,Outlook inspector 并不特别针对任何 Outlook 项目类型。 此代码示例利用创建用于访问常见 Outlook 项成员的帮助程序类一文中定义的 OutlookItem 帮助程序类,便捷地调用 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;
}
}