前言 每當(dāng)我在文章中提到.NET Framework的某個(gè)類、屬性或者方法時(shí),我會(huì)為它添加一個(gè)超鏈接,引用.NET Framework Class Library的在線文檔。首先,我用瀏覽器打開MSDN Library的頁面,接著,在左邊的導(dǎo)航目錄樹中定位到對(duì)應(yīng)的節(jié)點(diǎn),然后,把該節(jié)點(diǎn)的超鏈接復(fù)制下來,最后回到 word2007 中插入這個(gè)超鏈接。然而,我已經(jīng)對(duì)這個(gè)繁瑣的過程感到厭倦了,是否有辦法把.NET Framework Class Library的在線文檔集成到 Word 2007 中,從而讓這個(gè)過程變得更加簡單呢?
需求 X 需求
下圖是用Paint.NET弄出來的示意圖:
圖 1
我希望把MSDN Library上.NET Framework Class Library那部分導(dǎo)航目錄樹以側(cè)邊欄的方式集成到Word 2007里,這樣,當(dāng)我右擊某個(gè)節(jié)點(diǎn),點(diǎn)擊Insert菜單項(xiàng)時(shí),將在當(dāng)前文檔的光標(biāo)處插入該節(jié)點(diǎn)對(duì)應(yīng)的連接。
作為用戶,我提出了上面這些需求,那么,作為開發(fā)人員,為了實(shí)現(xiàn)這項(xiàng)功能,我又該提出哪些"需求"呢?
首先,我需要MSDN提供訪問這些數(shù)據(jù)的服務(wù),沒有這個(gè)服務(wù),實(shí)現(xiàn)這項(xiàng)功能就非常困難,甚至變得不可能。幸虧,MSDN的確提供了這樣一個(gè)服務(wù),它叫MTPS(MSDN/TechNet Publishing System)Content Service(以下簡稱"MPTS")。這樣,實(shí)現(xiàn)這項(xiàng)功能的首要任務(wù)就是學(xué)習(xí)使用這個(gè)服務(wù)了。這里將會(huì)用到Craig Andera在其文章上所提到的知識(shí)和技巧(見下表)。
其次,我需要知道如何為Word 2007創(chuàng)建側(cè)邊欄以及為這個(gè)插件在Ribbon上添加一個(gè)啟動(dòng)按鈕。這里將會(huì)用到《探索 Word 2007 開發(fā)(一):我的博客》、《探索 Word 2007 開發(fā)(三):管理側(cè)欄》和《探索 Word 2007 開發(fā)(二):擴(kuò)展 Ribbon》三篇文章的研究成果。
再次,我需要知道TreeView這個(gè)控件的使用方法和技巧。這里將會(huì)用到《TreeView 四技》這篇文章的研究成果。
最后,我需要知道如何在Word 2007中插入超鏈接。
多重影分身術(shù)
多重影分身術(shù)是一種實(shí)體復(fù)制忍術(shù),如果你看過《火影忍者》,應(yīng)該能夠理解它的意思。現(xiàn)在我要做的和這個(gè)差不多,為MSDN Library的.NET Framework Class Library導(dǎo)航目錄樹產(chǎn)生出多個(gè)實(shí)體分身,并把它們嵌入 Word 2007 里,不同的是,多重影分身術(shù)是由本體實(shí)施,而這里的實(shí)體復(fù)制是由身為第三方的我來實(shí)施。
本節(jié)的焦點(diǎn)是用MTPS返回的數(shù)據(jù)填充側(cè)邊欄里的TreeView控件。下面是這個(gè)插件的需求列表:
一開始,TreeView里面只有一個(gè)頂節(jié)點(diǎn)——.NET Framework Class Library,且該節(jié)點(diǎn)是折疊的。
使用延遲填充技術(shù),每個(gè)可展開節(jié)點(diǎn)會(huì)且只會(huì)在第一次展開時(shí)訪問MTPS獲取數(shù)據(jù),并填充子節(jié)點(diǎn)。
這兩個(gè)需求看起來很簡單,然而,一旦和MTPS 結(jié)合使用就比較復(fù)雜了,你需要區(qū)分MPTS所使用的兩套標(biāo)識(shí)系統(tǒng),一套是用于標(biāo)識(shí)節(jié)點(diǎn)的導(dǎo)航的,另一套是用于標(biāo)識(shí)節(jié)點(diǎn)所指向的內(nèi)容的。如果你還沒接觸過MTPS,那么我強(qiáng)烈建議你先閱讀Craig Andera的兩篇文章,否則你有可能無法理解后面的內(nèi)容。這里我做一個(gè)簡單的介紹,MTPS有兩種節(jié)點(diǎn):導(dǎo)航節(jié)點(diǎn)和內(nèi)容節(jié)點(diǎn),導(dǎo)航節(jié)點(diǎn)與MSDN Library/TechNet Library左側(cè)的導(dǎo)航目錄樹中的節(jié)點(diǎn)一一對(duì)應(yīng);內(nèi)容節(jié)點(diǎn)則是與該導(dǎo)航節(jié)點(diǎn)對(duì)應(yīng)的用于顯示在右側(cè)的內(nèi)容。這兩種節(jié)點(diǎn)使用了同一種標(biāo)識(shí)模型,每一個(gè)標(biāo)識(shí)包含了三個(gè)部分:標(biāo)識(shí)符、區(qū)域信息和版本信息。其中標(biāo)識(shí)符又分五種類型:short ID、content alias、content GUID、content URL和asset ID。并非所有節(jié)點(diǎn)都同時(shí)具備這五種標(biāo)識(shí)符,也并非所有情況下MTPS都返回/接受這五種標(biāo)識(shí)符,于是,如果你需要在不同的標(biāo)識(shí)符之間切換,你可能需要再次訪問MTPS。有鑒于此,上述兩個(gè)需求的復(fù)雜性主要體現(xiàn)在處理不同種類的節(jié)點(diǎn)以及用于標(biāo)識(shí)這些節(jié)點(diǎn)的不同種類的標(biāo)識(shí)符上。