日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

VSTO之旅系列(三):自定義Excel UI

 法效天地 2014-01-29

本專題概要

  • 引言
  • 自定義任務(wù)窗體(Task Pane)
  • 自定義選項(xiàng)卡,即Ribbon
  • 自定義上下文菜單
  • 小結(jié)

 

引言

  在上一個(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ù)窗體的思路:

  • 首先,任務(wù)窗體是一個(gè)窗體,當(dāng)然就需要在創(chuàng)建的Excel解決方案中創(chuàng)建一個(gè)窗體的了,這里我們創(chuàng)建了一個(gè)用戶控件。
  • 創(chuàng)建和設(shè)計(jì)完用戶控件的界面之后,我們就需要把這個(gè)用戶控件添加到Excel中去了,然而我們?cè)谝郧暗慕佑|的開發(fā)中,添加控件都是把控件添加到某個(gè)幾個(gè)中去的,例如WinForm中要向窗體添加一個(gè)button按鈕,就需要把這個(gè)button添加進(jìn)Controls集合中,同樣VSTO也提供這樣一個(gè)把任務(wù)面板添加進(jìn)去的集合—— Microsoft.Office.Tools.CustomTaskPaneCollection,我們可以通過(guò) Globals.ThisAddIn.CustomTaskPanes這行代碼來(lái)獲得這個(gè)集合,然后調(diào)用Add方法就可以把我們自定義的任務(wù)面板添加進(jìn)Excel中了。
  • 添加進(jìn)去之后,我們還需要使任務(wù)面板顯示出來(lái),這樣就涉及了Visible屬性了,確實(shí) Microsoft.Office.Tools.CustomTaskPane 也有Visible屬性

  有了上面的分析過(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ù)窗體的代碼如下:

復(fù)制代碼
 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)
        {
        }
    }
復(fù)制代碼

三、自定義選項(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)卡:

  1. 右鍵你的Excel項(xiàng)目,添加—>新建項(xiàng),在彈出的添加新項(xiàng)窗口中選擇 "功能區(qū)(可視化設(shè)計(jì)器)" 
  2. 輸入名稱之后單擊添加按鈕
  3. 設(shè)計(jì)選項(xiàng)卡UI界面,本例子中添加了一個(gè)toggleButton.

通過(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):

  1. 設(shè)計(jì)RibbonTab,首先把ControlIdType屬性設(shè)置為Custom,不然我們?cè)O(shè)計(jì)的RibbonGroup部分將會(huì)在加載項(xiàng)選項(xiàng)卡下,然后設(shè)置Name為HelpTab,這樣我們創(chuàng)建的選項(xiàng)卡才會(huì)成為一個(gè)新的選項(xiàng)卡,如果我們想把ToggleButton放在Home選項(xiàng)卡下顯示,此時(shí)我們只需要把ControlIdType設(shè)置為Office,然后把OfficeId設(shè)置為TabHome, 具體情況大家可以測(cè)試看看的,關(guān)于Office 中內(nèi)置的Control ID 列表,大家可以從下面這個(gè)鏈接下載:  

    2007 Office System Document: Lists of Control IDs 

  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)的代碼放在該事件就可以了),具體代碼如下:

復(fù)制代碼
// 定義一個(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;
        }
復(fù)制代碼

運(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事件,主要代碼如下:

復(fù)制代碼
  // 添加一個(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);  
復(fù)制代碼

運(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 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多