本專題概要
引言 在上一個(gè)專題中為大家介紹如何創(chuàng)建Excel的解決方案,相信大家通過(guò)從上面一個(gè)專題之后了解了Excel的對(duì)象模型,以及Office兩種解決方案的,看完上一個(gè)專題之后,肯定很多朋友想為Excel自定義屬于自己的UI界面,例如,有這樣的一些疑問(wèn)——是否可以使用VSTO來(lái)自定義選項(xiàng)卡呢? 是否可以自定義上下文菜單的呢?如果你也有這些疑問(wèn)的話,相信通過(guò)本專題你將會(huì)得到答案的,下面就開始我們本專題的介紹。 二、自定義任務(wù)窗體 在使用Word2010的時(shí)候我們可以通過(guò)左邊的導(dǎo)航來(lái)看了解文檔的結(jié)構(gòu),同時(shí)我們也可以在輸入框的地方輸入文字來(lái)進(jìn)行搜索,然而這個(gè)左邊的導(dǎo)航就是一個(gè)任務(wù)窗體,相信通過(guò)下面的圖大家可以理解Word中那部分是一個(gè)任務(wù)窗體: 但是我們?cè)谑褂肊xcel中卻沒有找到類似的任務(wù)窗體,這時(shí)候大家肯定會(huì)有這樣一個(gè)疑問(wèn)——如果我想在Excel也想實(shí)現(xiàn)一個(gè)自定義任務(wù)窗體該怎么辦呢?用VSTO可以幫我們辦到嗎?答案是肯定的。首先先模擬一個(gè)需求的,相信大家都知道使用F1是打開一個(gè)幫助文檔,但是彈出的幫助文檔是與Excel在不同界面的,所以很多朋友在查閱幫助的文檔的時(shí)候都需要縮小Excel文檔來(lái)查閱,這樣就顯得有些不方便了,我在使用的時(shí)候就想,能不能把幫助文檔繼承在Excel的右邊呢?這樣我們查閱Excel幫助文檔就方便多了,就不要縮小Excel文檔,或在Excel和幫助文檔之間左右切換了。既然有這種需求,我們就有實(shí)現(xiàn)它的必要性,下面就具體說(shuō)說(shuō)如何實(shí)現(xiàn)的: 首先在看具體代碼之前,我向大家分析下實(shí)現(xiàn)一個(gè)任務(wù)窗體的思路:
有了上面的分析過(guò)程之后,相信大家看下面的代碼會(huì)比較容易理解,另外注意的一點(diǎn)是,因?yàn)槲覀円獙?shí)現(xiàn)的幫助文檔的任務(wù)窗體,由于幫助文檔是在瀏覽器中顯示的,這樣我們就需要集成一個(gè)瀏覽器到我們的創(chuàng)建的用戶控件中的,大家看到瀏覽器這個(gè)詞可千萬(wàn)不要覺得有所畏懼,因?yàn)槲④浱峁┝?strong>WebBrowser控件來(lái)幫助我們實(shí)現(xiàn),對(duì)于瀏覽器的更多內(nèi)容可以參看我的這篇博客:自定義Web瀏覽器, 自定義任務(wù)窗體的代碼如下: public partial class ThisAddIn { // 定義一個(gè)任務(wù)窗體 internal Microsoft.Office.Tools.CustomTaskPane helpTaskPane; private void ThisAddIn_Startup(object sender, System.EventArgs e) { // 把自定義窗體添加到CustomTaskPanes集合中 // ExcelHelp 是一個(gè)自定義控件類 helpTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(new ExcelHelp(""), "Excel Help"); // 使任務(wù)窗體可見 helpTaskPane.Visible = true; // 通過(guò)DockPosition屬性來(lái)控制任務(wù)窗體的??课恢茫? // 設(shè)置為 MsoCTPDockPosition.msoCTPDockPositionRight這個(gè)代表??康接疫叄@個(gè)值也是默認(rèn)值 //helpTaskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionRight; } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } } 三、自定義選項(xiàng)卡,即Ribbon 上面實(shí)現(xiàn)的任務(wù)窗體在Excel一打開的時(shí)候就會(huì)顯示??吭贓xcel的右邊,如下圖所示: 然而當(dāng)我們點(diǎn)擊任務(wù)窗體中的"X"按鈕就是關(guān)閉任務(wù)窗體,關(guān)閉之后就有一個(gè)問(wèn)題,如果我們又想把幫助任務(wù)窗體顯示出來(lái)怎么辦呢?因?yàn)樵赪ord中的導(dǎo)航窗體也不是一開始就顯示的(有些朋友可能打開的Word文檔沒有導(dǎo)航窗體),此時(shí)我們通過(guò)勾選視圖選項(xiàng)卡中 “導(dǎo)航窗格”或點(diǎn)擊開始選項(xiàng)卡中的查找按鈕來(lái)顯示導(dǎo)航窗體: 此時(shí),我們就想在Excel中是否可以自定義一個(gè)選項(xiàng)卡,通過(guò)選項(xiàng)卡中按鈕來(lái)顯示/隱藏 Excel的幫助任務(wù)窗體呢?下面就具體介紹如何創(chuàng)建一個(gè)自定義選項(xiàng)卡:
通過(guò)上面的步驟就可以創(chuàng)建一個(gè)自定義選項(xiàng)卡,這種方式創(chuàng)建的選項(xiàng)卡在Excel項(xiàng)目(針對(duì)的是外接Excel項(xiàng)目類型)啟動(dòng)的時(shí)候就會(huì)被加載。 下面具體介紹了如何設(shè)計(jì)選項(xiàng)卡(即Ribbon):
2. 從工具箱中拖出一個(gè)ToggleButton,把Label屬性設(shè)置為Help,并把ControlSize屬性設(shè)置為RibbonControlSizeLarge:
3. 雙擊 Help ToggleButton按鈕,實(shí)現(xiàn)它的單擊事件: // 幫助選項(xiàng)卡中toggleButton的單擊事件 private void toggleHelpBtn_Click(object sender, RibbonControlEventArgs e) { // 通過(guò)toggleHelpButton的選中狀態(tài)來(lái)控制幫助任務(wù)欄的顯示和隱藏 Globals.ThisAddIn.helpTaskPane.Visible = toggleHelpBtn.Checked; } 通過(guò)上面的三步也就完成了一個(gè)Ribbon的創(chuàng)建了,當(dāng)我們創(chuàng)建好一個(gè)Ribbon之后,我們可以通過(guò)我們自定義的Ribbon下的按鈕來(lái)顯示/隱藏我們的任務(wù)窗體,但是到這里,Ribbon的開發(fā)并沒有結(jié)束,此時(shí)還有一個(gè)問(wèn)題就是——當(dāng)我們點(diǎn)擊 “Excel help”右上角的X按鈕關(guān)閉時(shí),我們Ribbon下的按鈕狀態(tài)也要跟著更變(大家可以測(cè)試,當(dāng)我們關(guān)閉Word中的導(dǎo)航任務(wù)窗體時(shí),試圖下的"導(dǎo)航窗格"復(fù)選框“也會(huì)跟著改變),此時(shí)我們就需要實(shí)現(xiàn):點(diǎn)擊關(guān)閉按鈕與Help按鈕狀態(tài)同步的功能的,此時(shí)我們只需要對(duì)TaskPane的VisibleChanged事件進(jìn)行處理就可以(因?yàn)殛P(guān)閉任務(wù)窗體就會(huì)觸發(fā)該事件,所以只需要把同步狀態(tài)的代碼放在該事件就可以了),具體代碼如下: // 定義一個(gè)任務(wù)窗體 internal Microsoft.Office.Tools.CustomTaskPane helpTaskPane; private void ThisAddIn_Startup(object sender, System.EventArgs e) { // 把自定義窗體添加到CustomTaskPanes集合中 // ExcelHelp 是一個(gè)自定義控件類 helpTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(new ExcelHelp(""), "Excel Help"); // 使任務(wù)窗體可見 //helpTaskPane.Visible = true; // 通過(guò)DockPosition屬性來(lái)控制任務(wù)窗體的??课恢?, // 設(shè)置為 MsoCTPDockPosition.msoCTPDockPositionRight這個(gè)代表??康接疫叄@個(gè)值也是默認(rèn)值 //helpTaskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionRight; // 當(dāng)用戶點(diǎn)擊 “Excel help”右上角的X按鈕關(guān)閉時(shí),我們需要同步選項(xiàng)卡上button的狀態(tài) helpTaskPane.VisibleChanged += new EventHandler(helpTaskPane_VisibleChanged); // 添加上下文菜單 //AddToCellMenu(); } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } // 用戶點(diǎn)擊 "Excel Help" 側(cè)邊欄右上角的X按鈕關(guān)閉它時(shí) // 我們需要正確同步 “幫助”按鈕的狀態(tài) // 我們可以通過(guò)處理 “Excel Help”側(cè)邊欄的VisualChanged 事件完成 private void helpTaskPane_VisibleChanged(object sender, EventArgs e) { // 獲得Help Ribbon 對(duì)象 Help helpRibbon = Globals.Ribbons.GetRibbon<Help>(); // 同步Help Ribbon下的"幫助"按鈕的狀態(tài) helpRibbon.toggleHelpBtn.Checked = Globals.ThisAddIn.helpTaskPane.Visible; } 運(yùn)行效果圖為:
四、自定義上下文菜單 看完上面兩部分的實(shí)現(xiàn)之后,我在學(xué)習(xí)的過(guò)程中又想——能不能通過(guò)右鍵菜單來(lái)顯示/隱藏任務(wù)窗體呢? 對(duì)于這點(diǎn)VSTO也是可以做到的,我們只需要添加CommandBarButton對(duì)象(當(dāng)我們右鍵一個(gè)單元格(即為Cell)的時(shí)候,我們可以看到一上下文菜單,菜單內(nèi)所有控件(不管是按鈕還是排序這樣的菜單控件)),然后設(shè)置該對(duì)象的屬性和添加一個(gè)Click事件,主要代碼如下: // 添加一個(gè)自定義按鈕到單元格上下文菜單中 contextMenu =Application.CommandBars["Cell"]; CommandBarButton commandBarbtn = (CommandBarButton)contextMenu.Controls.Add(MsoControlType.msoControlButton, Before: 1); commandBarbtn.Tag = "Help_Tag"; commandBarbtn.Caption = "查看幫助"; commandBarbtn.FaceId = 49; commandBarbtn.Click+=new _CommandBarButtonEvents_ClickEventHandler(commandBarbtn_Click); 運(yùn)行效果為(這樣我們右鍵Cell的時(shí)候就會(huì)多出一個(gè)我們自己定義的 ”查看幫助“按鈕): 五、小結(jié) 到這里本專題的內(nèi)容就介紹完了,本專題主要介紹如何為Excel創(chuàng)建一個(gè)自定義的任務(wù)窗體、Ribbon和上下文菜單,對(duì)于Word和Outlook這部分的內(nèi)容我就不重復(fù)介紹,創(chuàng)建方式和Excel的創(chuàng)建方式很類似。在下一個(gè)專題中我將給大家介紹下如何創(chuàng)建Word解決方案。 本專題所有源碼:http://files.cnblogs.com/zhili/ExcelHelpTaskPane.zip
|
|