How to: 以動態方式加入功能表項目
命令是 XML-Based 指令資料表組態檔中定義 (.vsct),並具有DynamicItemStart旗標指定的位置上插入動態建立的指令的功能表。 當相關聯的 VSPackage 已經啟動,而且可以更新 VSPackage 開啟時,通常被建立動態的命令。
動態清單的兩種常用種類如下所示:
大部分最近使用 (MRU) 清單中,它通常會顯示最近開啟的文件的名稱。
會開啟 [Windows] 清單中,它通常會顯示目前的視窗的名稱。
DynamicItemStart上的命令定義的旗標指定命令是預留位置,直到開啟 VSPackage。 VSPackage 開啟時,將會取代預留位置 0 或更多的指令,在執行階段由 VSPackage,並加入至動態清單。 您可能無法看到功能表中的開啟 VSPackage 時才動態清單會出現的位置。
若要填入的動態清單,請整合式的開發環境 (IDE) 會先呼叫 VSPackage,若要尋找的第一個字元的版面配置區的 ID 一樣的識別碼。 當 IDE 找到符合的命令時,它會將命令的名稱加入至動態清單中。 然後 IDE 遞增的識別碼,並且會尋找另一個符合的命令,將加入至動態清單。 IDE 就會繼續增加 ID 並加入動態的清單,直到有更動態的指令。
第一個程序說明如何建立動態的 MRU 清單中子功能表。
第二個程序說明如何使用管理套件架構 (MPF) 填入的動態清單。
如需有關.vsct 檔案的詳細資訊,請參閱Visual Studio 命令表裡 (。Vsct) 檔案。
如何建立 MRU 清單的相關資訊,請參閱逐步解說: 加入大部分最近使用過的清單到子功能表。
建立動態的命令清單
若要建立動態的命令清單中,您必須先新增按鈕 .vsct 檔案中的項目。 這個項目會變成在 IDE 中清單的預留位置。 然後,在程式碼中實作清單本身。
若要建立動態的命令清單中的預留位置
在.vsct 檔案中,建立子功能表,其中包含的命令群組。 如需詳細資訊,請參閱 How to: 建立功能表、 子功能表和快顯功能表。
此子功能表會包含動態清單。
在Symbols一節的.vsct 檔案中,找出 GuidSymbol 項目,包含其他的命令。 新增 IDSymbol 項目MRUListGroup群組,並cmdidMRUList命令,是動態清單版面配置區,如下所示。
定義一組中,如下所示。
<Group guid="guidTopLevelMenuCmdSet" id="MRUListGroup" priority="0x100"> <Parent guid="guidTopLevelMenuCmdSet" id="SubMenu"/> </Group>
定義新的命令,以Button中的項目Buttons一節。
設定guid和id到 GUID:ID 對表示新項目的欄位。 GUID:ID 組,包含name的值GuidSymbol和IDSymbol先前步驟中的項目。
這個 GUID:ID 組是由 VSPackage 在執行階段所加入的動態指令清單中的第一個。 每個後續的動態命令具有比前一個動態的命令 ID 的 ID。
設定type屬性設定為按鈕。
動態命令具有就像任何其他命令的按鈕類型。
沒有設定priority命令的屬性。
此子功能表包含只有一個動態清單。 因此,第一個項目的優先權並不重要。 稍後新增動態項目具有相同的優先順序。 每個加入的順序決定了原有的相對位置。
新增父項目具有guid和id與群組] 子功能表所建立的相符的屬性。
新增命令旗標 項目並設定其值 DynamicItemStart。
這會將命令標記做為預留位置。
注意事項 所有其他旗標都會被忽略。若您想要控制動態項目的可見性,您必須進行從 VSPackage 在執行階段。
新增字串 項目,包含 藉 項目和 CommandName 項目和屬性的值,版面配置區的名稱。
一般而言,不會出現此按鈕的文字,如果 VSPackage 可以初始化動態清單,就會顯示包含該功能表之前。
未指定圖示項目。
動態指令不能有與其相關聯的圖示。
下列範例會顯示已完成的命令定義 MRU 清單的版面配置區。
<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>
實作動態清單
管理套件架構 (MPF) 會使用事件處理常式的詳細資料IOleCommandTarget介面,其QueryStatus方法。 對於 VSPackage 所撰寫使用 MPF 來支援動態功能表命令的清單,來建立一份OleMenuCommand物件,每一個都代表動態清單中的項目。 每個OleMenuCommand物件有相同的事件處理常式,來執行命令,並可用來取得命令的狀態相同的事件處理常式。
注意事項 |
---|
下列程序使用的程式碼,從逐步解說: 加入大部分最近使用過的清單到子功能表來說明如何實作動態清單。不過,程式碼並不會建立完整的 VSPackage。完整的範例中,請參閱逐步解說。 |
若要實作的動態清單
將 ID 加到 PkgCmdID.cs 中的編號清單。
public const uint cmdidMRUList = 0x200;
在 TopLevelMenuPackage.cs 中加入這 using 陳述式。
using System.Collections;
繫結至的版面配置區OleMenuCommand執行個體,並指派其事件處理常式。 下列範例所示的方法從呼叫Initialize()封裝的方法。
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); } }
此程序中的範例假設使用下列的私用變數。
private int numMRUItems = 4; private int baseMRUID = (int)PkgCmdIDList.cmdidMRUList; private ArrayList mruList;
填入動態清單中,使用 QueryStatus 事件處理常式,如下列範例所示。
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; } } }
實作執行處理常式來回應按一下清單上的項目時。 下列範例會更新清單項目的位置,使最新的顯示在頂端。
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)); } } }
藉由設定控制項的功能表或個別功能表項目的可見性Visible屬性。 下列程式碼呈現的功能表或功能表項目隱藏起來。
var menuCommand = sender as OleMenuCommand; menuCommand.Visible = false;
上述程式碼置於 QueryStatus 處理常式套用到整個功能表因為它提供sender到該處理常式的引數。 不過,把它放在執行處理常式會影響只是正在執行的個別功能表項目。