gpt4 book ai didi

c# - 菜单项的动态可见性

转载 作者:太空狗 更新时间:2023-10-29 17:50:43 24 4
gpt4 key购买 nike

在我的 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>

并将此代码添加到包初始化中:

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

问题是 - 这个状态处理程序永远不会被调用。所以我为所有项目类型显示了这个菜单项。

我也尝试在我的包上实现 IOleCommandTarget 接口(interface),例如:

    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 没有任何作用。我应该如何为不受支持的菜单项隐藏此菜单项?

最佳答案

问题可能与包的加载有关。要自动加载包,只需将此属性添加到您的包类:

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

例如:

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

当你不添加这个属性时,你的类将在你点击你的包的任何按钮时加载。

希望对您有所帮助。

关于c# - 菜单项的动态可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21929372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com