逐步解說: 加入大部分最近使用過的清單到子功能表
本逐步解說為基礎,在示範在逐步解說: 加入子功能表至功能表,並示範如何加入子功能表中的動態清單。 動態清單表單的基礎,建立最近使用過的 (MRU) 清單。
動態功能表清單從開始功能表上的版面配置區。 每一次,就會顯示功能表, Visual Studio整合式的開發環境 (IDE) 會要求應該會顯示在 [版面配置區的所有命令的 VSPackage。 在功能表上隨時隨地可能發生的動態清單。 不過,動態清單通常是儲存,本身會顯示在子功能表,或在功能表底端。 藉由使用這些設計模式,您可以啟用動態的一份命令清單來展開及收合,而不會影響功能表上的其他指令的位置。 在這個逐步解說中,動態 MRU 清單會顯示在現有的子功能表,以列分開是挪用了子功能表的底部。
技術上來說,動態清單也可以套用至選取的工具列。 不過,我們防止這種用法,因為工具列應該維持不變,除非使用者採取特定步驟,使之變更。
本逐步解說會建立四個項目變更它們的順序,每次選取其中一個時,MRU 清單 (選取的項目移動到清單頂端)。
如需有關功能表和.vsct 檔案的詳細資訊,請參閱命令、 功能表和工具列。
必要條件
若要完成這個逐步解說中,您必須安裝Visual Studio 2010 SDK。
注意事項 |
---|
如需有關 Visual Studio 的 SDK 的詳細資訊,請參閱擴充 Visual Studio 的概觀。若要了解如何下載 Visual Studio 的 SDK,請參閱Visual Studio 擴充性開發人員中心 MSDN 網站上。 |
Visual Studio 的封裝專案範本的位置
Visual Studio 的封裝的專案範本有三個位置都在新的專案對話方塊:
在 Visual Basic 擴充性。 專案的預設語言是 Visual Basic。
在 C# 擴充性。 專案的預設語言是 C#。
在其他專案類型擴充性。 專案的預設語言是 c + +。
建立 VSPackage
若要建立 TopLevelMenu VSPackage
- 請依照下列程序逐步解說: 加入子功能表至功能表在下列程序中建立並修改 [] 子功能表。
在這個逐步解說的程序會假設 VSPackage 的名稱是 TopLevelMenu,也就是名稱中使用的逐步解說:] 中新增 [Visual Studio] 的功能表列 (C#)。
建立動態的項目清單] 指令
若要建立動態的項目清單] 指令
開啟 [TopLevelMenu.vsct]。
在Symbols一節,在GuidSymbol名為 guidTopLevelMenuCmdSet,新增的符號MRUListGroup群組,並cmdidMRUList命令,如下所示。
在Groups一節,在現有的群組項目之後加入宣告的群組。
在Buttons區段中,新增節點來代表新宣告的命令中,在現有的按鈕項目之後。
<Button guid="guidTopLevelMenuCmdSet" id="cmdidMRUList" type="Button" priority="0x0100"> <Parent guid="guidTopLevelMenuCmdSet" id="MRUListGroup" /> <CommandFlag>DynamicItemStart</CommandFlag> <Strings> <CommandName>cmdidMRUList</CommandName> <ButtonText>MRU Placeholder</ButtonText> </Strings> </Button>
DynamicItemStart旗標可讓動態產生的命令。
在建置 ] 功能表中,按一下 建置方案。
如此一來,就會重新建立.vsct 的檔案所做的變更。 更正任何建置期間可能發生的錯誤。
按 F5 來測試新的命令的顯示方式。
在 TestMenu 功能表中,按一下 [新增] 子功能表中, ] 子功能表,以顯示 [新增] 命令, MRU 版面配置區。 實作命令動態 MRU 清單中下一個程序之後,此命令的標籤將會取代由該清單中每次開啟子功能表時。
注意事項 您必須先關閉實驗Visual Studio您繼續進行下一個章節之前。
填滿 MRU 清單
若要使用 managed 程式碼填入 MRU 清單
在程式碼編輯器中開啟 PkgCmdID.cs 或 PkgCmdID.vb。
在現有的命令 Id 之後加入下列的命令 ID PkgCmdIDList類別定義。
public const uint cmdidMRUList = 0x200;
在程式碼編輯器中開啟 TopLevelMenuPackage.cs 或 TopLevelMenuPackage.vb。
在上方的檔案,請使用陳述式的清單結尾處加入下列陳述式。
using System.Collections;
找出Initialize方法。 您可能要找出標示為 「 封裝成員 」 的隱藏的區域,並加以展開。 Initialize方法就會在此隱藏的區域。
若要Initialize方法,加入下面這一行上一次呼叫之後,只是AddCommand方法。 InitMRUMenu會等到後步驟 8,則是未定義。
this.InitMRUMenu(mcs);
結尾的MyTopLevelMenuPackage類別,請新增下列程式碼只是在SubItemCallback方法。 這段程式碼會將初始化字串表示根據 MRU 清單中顯示的項目的清單。
private int numMRUItems = 4; private int baseMRUID = (int)PkgCmdIDList.cmdidMRUList; private ArrayList mruList; private void InitializeMRUList() { if (null == this.mruList) { this.mruList = new ArrayList(); if (null != this.mruList) { for (int i = 0; i < this.numMRUItems; i++) { this.mruList.Add(string.Format(CultureInfo.CurrentCulture, "Item {0}", i + 1)); } } } }
後InitializeMRUList方法,加入下列InitMRUMenu方法。 這會初始化 MRU 清單的功能表命令。
private void InitMRUMenu(OleMenuCommandService mcs) { InitializeMRUList(); for (int i = 0; i < this.numMRUItems; i++) { var cmdID = new CommandID( GuidList.guidTopLevelMenuCmdSet, this.baseMRUID + i); var mc = new OleMenuCommand( new EventHandler(OnMRUExec), cmdID); mc.BeforeQueryStatus += new EventHandler(OnMRUQueryStatus); mcs.AddCommand(mc); } }
在 managed 程式碼,您必須建立每一個可能的項目,在 [MRU 清單中的功能表命令的物件。 IDE 呼叫OnMRUQueryStatus方法,每個項目在 [MRU 清單,直到沒有更多的項目。 在 managed 程式碼,知道有沒有更多的項目 ide 的唯一方法是先建立所有可能的項目。 如果您想要的選項,您可以將標示為在不可見的其他項目第一次使用mc.Visible = false;建立的功能表命令之後。 這些項目可再變成可見稍後藉由使用mc.Visible = true;在OnMRUQueryStatus方法。
後InitMRUMenu方法,加入下列OnMRUQueryStatus方法。 這是設定為每個最近使用項目文字的處理常式。
private void OnMRUQueryStatus(object sender, EventArgs e) { OleMenuCommand menuCommand = sender as OleMenuCommand; if (null != menuCommand) { int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID; if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count) { menuCommand.Text = this.mruList[MRUItemIndex] as string; } } }
後OnMRUQueryStatus方法,加入下列OnMRUExec方法。 這是選取最近使用項目處理常式。 這個方法會將選取的項目移到清單頂端,然後顯示訊息方塊中的 [選取的項目。
private void OnMRUExec(object sender, EventArgs e) { var menuCommand = sender as OleMenuCommand; if (null != menuCommand) { int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID; if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count) { string selection = this.mruList[MRUItemIndex] as string; for (int i = MRUItemIndex; i > 0; i--) { this.mruList[i] = this.mruList[i - 1]; } this.mruList[0] = selection; System.Windows.Forms.MessageBox.Show( string.Format(CultureInfo.CurrentCulture, "Selected {0}", selection)); } } }
按一下 [建置] 功能表上的 [建置方案],即可建置此方案。 修正任何錯誤,可能會發生。
測試 MRU 清單
若要測試 MRU 功能表清單
按 F5 來測試新的命令的顯示方式。
在 TestMenu ] 功能表中,按一下 測試指令。 這麼做會顯示訊息方塊,表示命令已選取。
注意事項 若要強制載入並正確顯示 [MRU 清單 VSPackage 必須進行這個步驟。如果您略過此步驟時,MRU 清單將不會顯示。
在測試] 功能表 ] 功能表中,按一下 ] 子功能表。 四個項目清單會顯示] 子功能表下方分隔符號的結尾。 當您按下項目 3,應該會出現訊息方塊,並將其顯示文字,也就是 [選定項目 3]。 (如果沒有顯示四個項目清單,確保您遵循先前步驟中的指示。
開啟子功能表。 請注意, 項目 3 現在已經高達清單的頂端和其他項目已推向下移動一個位置。 按一下 項目 3 一次,並通知訊息] 方塊中的色彩仍會顯示 「 選定 Item 3",表示文字已正確地移動至新的位置,加上 [指令] 標籤。