VSTO之旅系列 三 自定義Excel UI

2022-02-05 06:13:15 字數 4190 閱讀 6632

本專題概要

引言

在上乙個專題中為大家介紹如何建立excel的解決方案,相信大家通過從上面乙個專題之後了解了excel的物件模型,以及office兩種解決方案的,看完上乙個專題之後,肯定很多朋友想為excel自定義屬於自己的ui介面,例如,有這樣的一些疑問——是否可以使用vsto來自定義選項卡呢? 是否可以自定義上下文選單的呢?如果你也有這些疑問的話,相信通過本專題你將會得到答案的,下面就開始我們本專題的介紹。

二、自定義任務窗體

在使用word2010的時候我們可以通過左邊的導航來看了解文件的結構,同時我們也可以在輸入框的地方輸入文本來進行搜尋,然而這個左邊的導航就是乙個任務窗體,相信通過下面的圖大家可以理解word中那部分是乙個任務窗體:

但是我們在使用excel中卻沒有找到類似的任務窗體,這時候大家肯定會有這樣乙個疑問——如果我想在excel也想實現乙個自定義任務窗體該怎麼辦呢?用vsto可以幫我們辦到嗎?答案是肯定的。首先先模擬乙個需求的,相信大家都知道使用f1是開啟乙個幫助文件,但是彈出的幫助文件是與excel在不同介面的,所以很多朋友在查閱幫助的文件的時候都需要縮小excel文件來查閱,這樣就顯得有些不方便了,我在使用的時候就想,能不能把幫助文件繼承在excel的右邊呢?這樣我們查閱excel幫助文件就方便多了,就不要縮小excel文件,或在excel和幫助文件之間左右切換了。既然有這種需求,我們就有實現它的必要性,下面就具體說說如何實現的:

有了上面的分析過程之後,相信大家看下面的**會比較容易理解,另外注意的一點是,因為我們要實現的幫助文件的任務窗體,由於幫助文件是在瀏覽器中顯示的,這樣我們就需要整合乙個瀏覽器

public

partial

class

thisaddin

private

void thisaddin_shutdown(object

sender, system.eventargs e)

}

三、自定義選項卡,即ribbon

上面實現的任務窗體在excel一開啟的時候就會顯示停靠在excel的右邊,如下圖所示:

然而當我們點選任務窗體中的"x"按鈕就是關閉任務窗體,關閉之後就有乙個問題,如果我們又想把幫助任務窗體顯示出來怎麼辦呢?因為在word中的導航窗體也不是一開始就顯示的(有些朋友可能開啟的word文件沒有導航窗體),此時我們通過勾選檢視選項卡中 「導航窗格」或點選開始選項卡中的查詢按鈕來顯示導航窗體:

此時,我們就想在excel中是否可以自定義乙個選項卡,通過選項卡中按鈕來顯示/隱藏 excel的幫助任務窗體呢?下面就具體介紹如何建立乙個自定義選項卡:

右鍵你的excel專案,新增—>新建項,在彈出的新增新項視窗中選擇 "功能區(視覺化設計器)" 

輸入名稱之後單擊新增按鈕

設計選項卡ui介面,本例子中新增了乙個togglebutton.

通過上面的步驟就可以建立乙個自定義選項卡,這種方式建立的選項卡在excel專案(針對的是外接excel專案型別)啟動的時候就會被載入。

下面具體介紹了如何設計選項卡(即ribbon):

2007 office system document: lists of control ids

2. 從工具箱中拖出乙個togglebutton,把label屬性設定為help,並把controlsize屬性設定為ribboncontrolsizelarge:

3. 雙擊 help togglebutton按鈕,實現它的單擊事件:

//

幫助選項卡中togglebutton的單擊事件

private

void togglehelpbtn_click(object

sender, ribboncontroleventargs e)

通過上面的三步也就完成了乙個ribbon的建立了,當我們建立好乙個ribbon之後,我們可以通過我們自定義的ribbon下的按鈕來顯示/隱藏我們的任務窗體,但是到這裡,ribbon的開發並沒有結束,此時還有乙個問題就是——當我們點選 「excel help」右上角的x按鈕關閉時,我們ribbon下的按鈕狀態也要跟著更變(大家可以測試,當我們關閉word中的導航任務窗體時,試圖下的"導航窗格"核取方塊「也會跟著改變),此時我們就需要實現:點選關閉按鈕與help按鈕狀態同步的功能的,此時我們只需要對taskpane的visiblechanged事件進行處理就可以(因為關閉任務窗體就會觸發該事件,所以只需要把同步狀態的**放在該事件就可以了),具體**如下:

//

定義乙個任務窗體

internal

microsoft.office.tools.customtaskpane helptaskpane;

private

void thisaddin_startup(object

sender, system.eventargs e)

private

void thisaddin_shutdown(object

sender, system.eventargs e)

//

使用者點選 "excel help" 側邊欄右上角的x按鈕關閉它時

//我們需要正確同步 「幫助」按鈕的狀態

//我們可以通過處理 「excel help」側邊欄的visualchanged 事件完成

private

void helptaskpane_visiblechanged(object

sender, eventargs e)

執行效果圖為:

四、自定義上下文選單

看完上面兩部分的實現之後,我在學習的過程中又想——能不能通過右鍵選單來顯示/隱藏任務窗體呢? 對於這點vsto也是可以做到的,我們只需要新增commandbarbutton物件(當我們右鍵乙個單元格(即為cell)的時候,我們可以看到一上下文選單,選單內所有控制項(不管是按鈕還是排序這樣的選單控制項)),然後設定該物件的屬性和新增乙個click事件,主要**如下:

// 新增乙個自定義按鈕到單元格上下文選單中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);

執行效果為(這樣我們右鍵cell的時候就會多出乙個我們自己定義的 」檢視幫助「按鈕):

五、小結

到這裡本專題的內容就介紹完了,本專題主要介紹如何為excel建立乙個自定義的任務窗體、ribbon和上下文選單,對於word和outlook這部分的內容我就不重複介紹,建立方式和excel的建立方式很類似。在下乙個專題中我將給大家介紹下如何建立word解決方案。

本專題所有原始碼: 

VSTO 系列(06) 自定義任務窗格

任務窗格 task pane 是 vsto 提供的主要介面之一,執行時任務窗格的介面看起來如下。本文假設我們要實現乙個方便自己進行拷貝和貼上的多重剪貼簿,實現將單元格中需要反覆使用的文字載入到 listbox,並且能夠拷貝到選中的單元格中。任務窗格本質上是乙個 user control,在工程中新建...

十三 自定義元件

有時候需要自定義元件使得web程式更加豐富,extjs也提供了自定義元件的功能,主要通過ext.define來實現。下面先新建乙個mypanel.html檔案,其內容如下 然後新建乙個mypanel.js和xzypanel.js檔案,自定義的元件名稱為xzypanel,xzypanel.js檔案的內...

osgi 學習系列(三)自定義osgi控制台命令

為了後面demo的結果顯示需要先說下自定義osgi控制台命令,自定義命令的類必須實現org.eclipse.osgi.framework.console.commandprovider介面 該介面中只有乙個方法public string gethelp 用於在help方法中新增我們自定義命令的描述 ...