共用方式為


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 中清單的預留位置。 然後,在程式碼中實作清單本身。

若要建立動態的命令清單中的預留位置

  1. 在.vsct 檔案中,建立子功能表,其中包含的命令群組。 如需詳細資訊,請參閱 How to: 建立功能表、 子功能表和快顯功能表

    此子功能表會包含動態清單。

  2. Symbols一節的.vsct 檔案中,找出 GuidSymbol 項目,包含其他的命令。 新增 IDSymbol 項目MRUListGroup群組,並cmdidMRUList命令,是動態清單版面配置區,如下所示。

  3. 定義一組中,如下所示。

    <Group guid="guidTopLevelMenuCmdSet" id="MRUListGroup" priority="0x100">
      <Parent guid="guidTopLevelMenuCmdSet" id="SubMenu"/>
    </Group>
    
  4. 定義新的命令,以Button中的項目Buttons一節。

    1. 設定guid和id到 GUID:ID 對表示新項目的欄位。 GUID:ID 組,包含name的值GuidSymbol和IDSymbol先前步驟中的項目。

      這個 GUID:ID 組是由 VSPackage 在執行階段所加入的動態指令清單中的第一個。 每個後續的動態命令具有比前一個動態的命令 ID 的 ID。

    2. 設定type屬性設定為按鈕。

      動態命令具有就像任何其他命令的按鈕類型。

    3. 沒有設定priority命令的屬性。

      此子功能表包含只有一個動態清單。 因此,第一個項目的優先權並不重要。 稍後新增動態項目具有相同的優先順序。 每個加入的順序決定了原有的相對位置。

    4. 新增項目具有guid和id與群組] 子功能表所建立的相符的屬性。

    5. 新增命令旗標 項目並設定其值 DynamicItemStart。

      這會將命令標記做為預留位置。

      注意事項注意事項

      所有其他旗標都會被忽略。若您想要控制動態項目的可見性,您必須進行從 VSPackage 在執行階段。

    6. 新增字串 項目,包含 項目和 CommandName 項目和屬性的值,版面配置區的名稱。

      一般而言,不會出現此按鈕的文字,如果 VSPackage 可以初始化動態清單,就會顯示包含該功能表之前。

    7. 未指定圖示項目。

      動態指令不能有與其相關聯的圖示。

    下列範例會顯示已完成的命令定義 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。完整的範例中,請參閱逐步解說。

若要實作的動態清單

  1. 將 ID 加到 PkgCmdID.cs 中的編號清單。

    public const uint cmdidMRUList = 0x200;
    
  2. 在 TopLevelMenuPackage.cs 中加入這 using 陳述式。

    using System.Collections;
    
  3. 繫結至的版面配置區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;
    
  4. 填入動態清單中,使用 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;
            }
        }
    }
    
  5. 實作執行處理常式來回應按一下清單上的項目時。 下列範例會更新清單項目的位置,使最新的顯示在頂端。

    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));
            }
        }
    }
    

    您也可以使用Text屬性或CommandID屬性,以找出哪一個項目被選取,並適當地回應。

  6. 藉由設定控制項的功能表或個別功能表項目的可見性Visible屬性。 下列程式碼呈現的功能表或功能表項目隱藏起來。

    var menuCommand = sender as OleMenuCommand;
    menuCommand.Visible = false;
    

    上述程式碼置於 QueryStatus 處理常式套用到整個功能表因為它提供sender到該處理常式的引數。 不過,把它放在執行處理常式會影響只是正在執行的個別功能表項目。

請參閱

概念

VSPackages 對 IDE 所新增的使用者介面項目

其他資源

命令、 功能表和工具列

一般工作的命令、 功能表和工具列