天天看點

我的VSTO之路(五):Outlook初步開發之聯系人擴充

上一講我們完成對Word的介紹,文本開始,我将着重介紹Outlook。Outlook是微軟Office中一個非常實用的工具,尤其在一個擁有Windows Domain的公司區域網路中,Outlook是員工最常用的通訊工具,是以對Outlook實行進一步的定制開發的需求量是很大的。本文中,我先以聯系人的擴充為開始,講解如何開發一個強大的Outlook插件。

首先我們假設一個場景。有一天,市場部的同僚來找你幫個小忙(有經驗的人都知道,一般這都是無盡痛苦的開始

我的VSTO之路(五):Outlook初步開發之聯系人擴充

)。他們希望在Outlook的聯系人資訊上加入對方父母生日資訊,友善他們做市場營銷(嘿嘿,怎麼營銷大家自己想咯

我的VSTO之路(五):Outlook初步開發之聯系人擴充

)。同時,最好能夠和Outlook原來的聯系人界面保持一緻便于查閱。為了不辜負同僚的期望,你打開了Visual Studio……

簡單思索過後,你在腦海中浮現了一下兩個功能點:

Outlook Form Region:用于制作界面,可以和原本的Outlook界面整合在一起。

Contact User Define Fields:用于儲存新加入的屬性。

而新的聯系人界面,你打算畫成這樣:

我的VSTO之路(五):Outlook初步開發之聯系人擴充

業務邏輯:每次Contact界面展示的時候,我們制作的Form Region會讀聯系人中使用者自定義屬性裡面的值(我們分别為父母的名字和生日建立4個使用者屬性),并展示在界面上。當Contact關閉的時候,如果使用者改變了這四個控件的值,我們将其寫回到自定義屬性中去。關于使用者自定義的屬性,如下圖:

我的VSTO之路(五):Outlook初步開發之聯系人擴充

Outlook Object Model介紹

正式開始之前,我們先了解一下Outlook的對象模型。

Microsoft.Office.Interop.Outlook.Application

Outlook中的Application對象就像我在之前在Word中介紹過的Application對象一樣,是所有對象的最頂層。即便你同時開多個Outlook,你也隻建立了一個Application(程序也隻有一個)。Application對象中,我們需要重點關注三個地方:

CreateItem方法:通過這個方法,我們建立新的Outlook對象,例如Email、Task、Contact等。

Explorers屬性: 獲得目前的Outlook.Explorer對象集合。

Inspectors屬性: 獲得目前的Outlook.Inspector對象集合。

有很多方法可以獲得Application對象,比較常用的是直接在Addin工程中,通過Globals.ThisAddIn.Application獲得。如果你看過我之前寫的Word插件,你會發現這裡是和Word VSTO,其實這是微軟為我們設定的模式。包括在之後的Excel和PowerPoint中也都是這樣的。我這裡進一步介紹一下Globals,它是一個在ThisAddIn.Designer.cs中定義的一個類,對于Outlook來說,它定義了三個靜态屬性,ThisAddin、Ribbons和Inspectors對象。Globals作用是,通過它我們可以在Addin項目的任何位置獲得我們所需要的上下文。

Microsoft.Office.Interop.Outlook.Explorer

Explorer類,即目前Outlook的主視窗。示顯示包含項(如電子郵件、任務或約會)的檔案夾内容的視窗。Explorer 類包括可用來修改視窗的方法和屬性,以及視窗更改時所引發的事件。需要注意的是,Outlook是可以開多個Explorer,但是隻有一個Application。這點和Word類似,而和我們以後會講到的Excel不同。一般我們通過Globals.ThisAddIn.Application.ActiveExplorer()方法來獲得目前(焦點所在)的Explorer。

Microsoft.Office.Interop.Outlook.Inspector

Inspector類,即一個Outlook Item的視窗,比如你寫郵件時彈出的視窗就是一個Inspector,你建立一個新的聯系人也是一個Inspector。Inspector類是在開發Outlook插件中很常用的。尤其是以下幾個地方:

獲得目前的Inspector:Globals.ThisAddIn.Application.ActiveInspector(),很多時候我們都會通過這個方法獲得現在的Inspector,但是這個不一定靠的住,我在今天的例子中就會講到一種特殊情況。

新Inspector建立事件:Globals.ThisAddIn.Application.Inspectors.NewInspector,如果你需要為每個Email加一個Task Pane,就需要使用到這個事件。

獲得Inspector對應的Outlook對象:Inspector.CurrentItem,Inspector隻是一個視窗,而這個視窗背後的Outlook對象,則需要通過這個方法取得。

Microsoft.Office.Interop.Outlook.MAPIFolder

MAPIFolder即Outlook中的目錄,Outlook中提供了16種内建的目錄類型,由枚舉Microsoft.Office.Interop.Outlook.OlDefaultFolders定義。

Microsoft.Office.Interop.Outlook.MailItem

Microsoft.Office.Interop.Outlook.AppointmentItem

Microsoft.Office.Interop.Outlook.TaskItem

Microsoft.Office.Interop.Outlook.ContactItem

分别對應Outlook中的Email、MeetingRequest、Task和Contact,它們都可以通過Application對象的CreateItem方法來建立。

Outlook Form Region

介紹

為了更好地制作界面,我們使用的是Outlook Form Region。它是從Outlook 2007開始,微軟進入一項新的技術。它提供一種更加友善的方式擴充Outlook項目的界面。相對之前的Custom Form,Form Region是基于.net,開發更加容易,而且和Outlook本身,結合得更加緊密。

建立Form Region

首先,我們添加一個新的Item,選擇Office項目類型中的Outlook Form Region

我的VSTO之路(五):Outlook初步開發之聯系人擴充

我們選擇設計一個新的Form Region

我的VSTO之路(五):Outlook初步開發之聯系人擴充

Form Region的類型為Adjoining,即增加在頁面的底部。

我的VSTO之路(五):Outlook初步開發之聯系人擴充

如果你需要在Region Form上添加比較多的控件,你也可以選擇Separate,這樣你就會有一個完整的空Form。它成為一個獨立的标簽頁,不合原始的Form沖突。

我的VSTO之路(五):Outlook初步開發之聯系人擴充

為Form Region 起名字,并且設定在編輯模式和閱讀模式中都顯示我們的Region Form。

我的VSTO之路(五):Outlook初步開發之聯系人擴充

我們的Form Region是嵌入在Contact中的。

我的VSTO之路(五):Outlook初步開發之聯系人擴充

完成了這一系列的配置之後,VS會幫我們建立一個空的Form Region,如果需要修改剛才的設定,可以它在屬性中修改,如下圖。

我的VSTO之路(五):Outlook初步開發之聯系人擴充

我們開始往這個Form上添加控件,一共兩個textbox、兩個datetimepicker:

我的VSTO之路(五):Outlook初步開發之聯系人擴充

業務邏輯實作

流程圖

這是根據我們的業務邏輯代碼制作的流程圖。

我的VSTO之路(五):Outlook初步開發之聯系人擴充

源代碼分析

成員變量

FormRegionShowing事件,這裡我們從Contact的使用者自定義屬性中取得值,并指派給控件。如果這些屬性不存在,我們則建立它們。同時我們所有的控件都綁定了Changed事件,便于我們判斷值是否改變。這裡有一個需要注意的地方,這裡我需要獲得Contact對象才能讀取Property,但是如果你的Form Region是Adjoining模式的,在FormRegionShowing事件中,你會發現你通過Globals.ThisAddIn.Application.ActiveInspector()是不能取到Inspector的,進一步你也不能通過Inspector獲得CurrentItem。這個問題在微軟的論壇上都很少被提及。我這裡所采用的方式是((EmployeeFamilyForm)sender).OutlookItem。可以看如下的代碼:

content_Changed和contact_Write事件

EmployeeFamilyForm_FormRegionClosed事件

後記

自此我們已經完成了對Outlook聯系人的擴充,在本文中我們介紹了Outlook Form Region和UserProperties的使用,基本圓滿完成了市場部的需求。話說IT幫他們實作這個需求之後,過了幾天市場部的同僚又來他們了。因為客戶的人數比較多,最好能做一個查詢工具希望可以做一個查詢工具,來友善他們檢索内容。至于如何檢索Outlook内部對象的方法,且聽下回分解。