插入類庫超鏈接
MTPS是用來返回內(nèi)容的,所以我們無法從返回的數(shù)據(jù)中得知節(jié)點(diǎn)所對應(yīng)的超鏈接。那么,我們?nèi)绾潍@取節(jié)點(diǎn)所對應(yīng)的超鏈接呢?如果無法獲得,那么我們之前所做的就白費(fèi)了。Google一下"MSDN MPTS"關(guān)鍵字,發(fā)現(xiàn)Tim Ewald曾經(jīng)在某期MSDN雜志上介紹過MSDN的超鏈接的設(shè)計思路,并從中得知如何推斷出節(jié)點(diǎn)所對應(yīng)的超鏈接。
推斷節(jié)點(diǎn)所對應(yīng)的超鏈接需要我們提供該節(jié)點(diǎn)的short ID,然而,除了我們手動賦之予short ID的根節(jié)點(diǎn)外,其下任一節(jié)點(diǎn)的Target屬性所包含的標(biāo)識符都是asset ID,這就意味著我們需要做一次轉(zhuǎn)換了:
Code 9
getContentResponse.contentId公共字段并非指代內(nèi)容節(jié)點(diǎn)的ID,而是指代short ID,無論該節(jié)點(diǎn)是導(dǎo)航節(jié)點(diǎn)還是內(nèi)容節(jié)點(diǎn),這是歷史遺留問題,如果你讀了第二課堂欄推薦的文章,你會發(fā)現(xiàn)這點(diǎn)微小的混亂。
接著,我為TocNode提供一個TargetUrl屬性,用于返回當(dāng)前節(jié)點(diǎn)所指向的內(nèi)容的超鏈接:
Code 10
值得注意的是,我在這里使用了m_TargetUrl對超鏈接進(jìn)行緩存,以保證該方法對于每個節(jié)點(diǎn)僅產(chǎn)生一次網(wǎng)絡(luò)訪問。
接下來就是本回的主角了,我希望右擊TreeView上的節(jié)點(diǎn)時彈出一個菜單,里面包含一個Insert菜單項(xiàng),當(dāng)我點(diǎn)擊這個菜單項(xiàng)時,在當(dāng)前文檔的光標(biāo)處插入這個節(jié)點(diǎn)對應(yīng)的連接。下面是Insert菜單項(xiàng)的Click事件委托:
Code 11
最后,要使Insert菜單項(xiàng)生效,我們必須把菜單掛接到節(jié)點(diǎn)上,這可以通過處理TreeView的NodeMouseClick事件做到:
Code 12
故技重施
雖然插入類庫連接的功能已經(jīng)可用,然而TocView也遇到了"我的博客"側(cè)邊欄曾經(jīng)遇到的問題:
隨word啟動,而不是由用戶根據(jù)需要啟動;
當(dāng)打開多個Word窗口時,僅顯示在第一個打開的窗口里。
對于這兩個問題,我將會使用《探索 Word 2007 開發(fā)(二):擴(kuò)展 Ribbon》和《探索 Word 2007 開發(fā)(三):管理側(cè)欄》這兩篇文章里提到的方法來處理。首先,創(chuàng)建一個Ribbon:
圖 1
然后,就是移植MyBlogsPaneManager過來管理TocView了。我當(dāng)然可以直接把MyBlogsPaneManager里面關(guān)于"我的博客"側(cè)邊欄的東西換成與TocView對應(yīng)的,然而,我希望讓MyBlogsPaneManager更通用,以便將來在遇到關(guān)于側(cè)邊欄管理問題可以直接使用。MyBlogsPaneManager的核心部分要數(shù)GetMyBlogsPane()方法了,要讓它變得通用,必須把里面和"我的博客"側(cè)邊欄相關(guān)的東西泛化,下面是該方法的改版代碼:
Code 13
需要說明的是,m_CustomTaskPanePool來自Globals.ThisAddIn.CustomTaskPanes,而后者里只存放當(dāng)前插件添加進(jìn)去的側(cè)邊欄,再加上同一個Word窗口里相同類型的側(cè)邊欄只會出現(xiàn)一次,于是,在上述代碼里,我通過側(cè)邊欄的父窗口和所含控件的類型來進(jìn)行判等是合理的。另外,由于添加側(cè)邊欄需要提供標(biāo)題,而標(biāo)題和控件的類型又是一一對應(yīng)的,于是,我使用了一個Dictionary<Type, string>來存放這些對應(yīng)信息。要注冊該信息,可以使用下面這個方法:
相關(guān)閱讀