簡體   English   中英

菜單項的動態可見性

[英]Dynamic Visibility of menu item

在我的 VS 擴展中,我需要為我的新項目類型添加菜單項。 但我希望它只顯示我的自定義類型。 所以我將此代碼添加到 .vcst 文件中:

  <Button guid="_Interactive_WindowCmdSet" id="cmdidLoadUI" priority="0x0100" type="Button">
    <Parent guid="_Interactive_WindowCmdSet" id="ProjectItemMenuGroup" />
    <Icon guid="guidImages" id="bmpPic1" />
    <CommandFlag>DynamicVisibility</CommandFlag>
    <Strings>
      <ButtonText>Load</ButtonText>
    </Strings>
  </Button>


  <Group  guid="_Interactive_WindowCmdSet" id="ProjectItemMenuGroup" priority="0x0600">
    <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_PROJNODE"/>
  </Group>

並將此代碼添加到 package 初始化中:

            // Create the command for the menu item.
            CommandID projectMenuCommandID = new CommandID(GuidList.Interactive_WindowCmdSet, (int)PkgCmdIDList.cmdidLoadUI);
            OleMenuCommand projectmenuItem = new OleMenuCommand(LoadUIMenuItemCallback, projectMenuCommandID);
            projectmenuItem.BeforeQueryStatus += projectmenuItem_BeforeQueryStatus;
            mcs.AddCommand(projectmenuItem);

查詢狀態處理程序是:

    private void projectmenuItem_BeforeQueryStatus(object sender, EventArgs e)
    {
        OleMenuCommand menuCommand = sender as OleMenuCommand;

        if (menuCommand != null)
            menuCommand.Visible = IsProjectOfRightType(GetSelected<Project>());
    }

問題是 - 這個狀態處理程序永遠不會被調用。 所以我為所有項目類型顯示了這個菜單項。

我還嘗試在我的 package 上實現IOleCommandTarget接口,例如:

    public int QueryStatus(ref Guid guidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
    {
        // Disable all commands in case if project is VisuaART project, otherwise - disable them.
        OLECMDF cmdf;

        for (int i = 0; i < cCmds; i++)
        {
            var command = prgCmds[i];
            if (command.cmdID == PkgCmdIDList.cmdidLoadUI)
            {
                if (IsProjectOfRightType(GetSelected<Project>()))
                    command.cmdf = (uint)COMMAND_SUPPORTED;
                else
                    command.cmdf = (uint)COMMAND_UNSUPPORTED;
            }

        }
        return VSConstants.S_OK;
    }

    private const OLECMDF COMMAND_SUPPORTED = OLECMDF.OLECMDF_SUPPORTED | OLECMDF.OLECMDF_ENABLED;
    private const OLECMDF COMMAND_UNSUPPORTED = OLECMDF.OLECMDF_INVISIBLE;

但這也無濟於事。 方法被調用,但設置OLECMDF.OLECMDF_INVISIBLE什么都不做。 對於不受支持的菜單項,我應該怎么做才能隱藏此菜單項?

可能問題與包的負載有關。 要自動加載Package,只需將此屬性添加到Package Class:

[ProvideAutoLoad("f1536ef8-92ec-443c-9ed7-fdadf150da82")]

例:

.
.
[ProvideAutoLoad("f1536ef8-92ec-443c-9ed7-fdadf150da82")]
public sealed class MyPackageTest : Package
{
.
.

如果不添加此屬性,則只需在單擊“包”的任何按鈕時加載該類。

我希望我有所幫助。

如果適用,Microsoft 建議在自動加載包時使用基於規則的 UI 上下文

加載包可能會對性能產生影響,並且比需要更快地加載它們不是最佳實踐。 Visual Studio 2015 引入了基於規則的 UI 上下文的概念,這種機制允許擴展作者定義激活 UI 上下文和加載關聯 VSPackage 的精確條件。

我只使用過這種策略來顯示特定文件類型的菜單項(這是一個簡單的 示例),但也有一些與項目相關的術語類型可能對這種情況更有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM