假设我们有一个带有工具栏和几个命令的VSPackage。如何以编程方式显示/隐藏工具栏上的其中一个命令?如果您是用户,可以通过自定义工具栏来执行此操作。因此我强烈感觉从代码中也必须有一种方法来实现这一点。
由于我们没有开发AddIn,所以无法使用DTE.Commands.AddNamedCommand(AddInInstance, Name, ButtonText, ToolTip, MSOButton)。
没关系,因为我们仍然可以使用Visual Studio Command Table (.vsct)格式定义我们的命令,并且这是VSPackages的建议方式。
问题在于,如果将菜单命令放置在工具栏上,则将Visible属性设置为false不会隐藏按钮,只会使其变灰。 (在任何其他菜单上都可以隐藏它。)这是Visual Studio的一个功能,而不是错误。
然而,我需要的正是这个:隐藏Button0。(假设Button0仅在满足某些特殊条件时显示,例如:您的硬盘上的可用空间少于X MB或您安装了某些其他工具,或者只需自己制定条件。)
如果不需要,可以使用AddIn时代的以下技术删除按钮:
发现了 Command0 ,但在尝试删除时出现异常:未指定错误(来自 HRESULT 的异常:0x80004005(E_FAIL))。毕竟,它是通过.vsct机制而不是以编程方式创建的,所以这有点说得通。
我已经没有更多想法了。请帮助我找出如何在运行时以编程方式隐藏/显示或添加/删除工具栏按钮。除了.vsct文件之外,是否还有其他定义VSPackage命令的方法?
非常感谢任何帮助。
由于我们没有开发AddIn,所以无法使用DTE.Commands.AddNamedCommand(AddInInstance, Name, ButtonText, ToolTip, MSOButton)。
没关系,因为我们仍然可以使用Visual Studio Command Table (.vsct)格式定义我们的命令,并且这是VSPackages的建议方式。
<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<Extern href="vsshlids.h" />
<Commands package="testPackage">
<Menus> <!-- Define the menus, toolbars, etc. -->
<Menu guid="commands" id="toolbar" type="Toolbar">
<Parent guid="guidSHLMainMenu" id="IDG_VS_BUILD_SOLUTION" />
<CommandFlag>DefaultDocked</CommandFlag>
<Strings>
<ButtonText>TestToolbar</ButtonText>
</Strings>
</Menu>
</Menus>
<Groups> <!-- Define the groups for commands -->
<Group guid="commands" id="toolbarGroup" priority="0x0001">
<Parent guid="commands" id="toolbar" />
</Group>
</Groups>
<Buttons> <!-- Define the commands as buttons -->
<Button guid="commands" id="button0" type="Button">
<Parent guid="commands" id="toolbarGroup" />
<CommandFlag>DynamicVisibility</CommandFlag>
<Strings>
<ButtonText>TestButton0</ButtonText>
</Strings>
</Button>
<Button guid="commands" id="button1" type="Button">
<Parent guid="commands" id="toolbarGroup" />
<CommandFlag>DynamicVisibility</CommandFlag>
<Strings>
<ButtonText>TestButton1</ButtonText>
</Strings>
</Button>
</Buttons>
</Commands>
<Symbols>
<GuidSymbol name="testPackage" value="{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}" />
<GuidSymbol name="commands" value="{EEEEEEEE-EEEE-EEEE-EEEE-EEEEEEEEEEEE}">
<IDSymbol name="toolbar" value="0x0100" />
<IDSymbol name="toolbarGroup" value="0x0010" />
<IDSymbol name="button0" value="0x0000" />
<IDSymbol name="button1" value="0x0001" />
</GuidSymbol>
</Symbols>
</CommandTable>
在后面的C#代码中,您可以设置我们刚刚定义的MenuCommand的不同属性:
System.ComponentModel.Design.MenuCommand menuCommand = <Acquire your menu command>;
menuCommand.Enabled = <enabled>;
menuCommand.Visible = <visible>;
menuCommand.Supported = <supported>;
问题在于,如果将菜单命令放置在工具栏上,则将Visible属性设置为false不会隐藏按钮,只会使其变灰。 (在任何其他菜单上都可以隐藏它。)这是Visual Studio的一个功能,而不是错误。
然而,我需要的正是这个:隐藏Button0。(假设Button0仅在满足某些特殊条件时显示,例如:您的硬盘上的可用空间少于X MB或您安装了某些其他工具,或者只需自己制定条件。)
如果不需要,可以使用AddIn时代的以下技术删除按钮:
EnvDTE.Command button0 = DTE.Commands.Item(commandsGuid, button0CommandId); // Both are the same as in the .vsct file
if (button0 != null)
button0.Delete();
发现了 Command0 ,但在尝试删除时出现异常:未指定错误(来自 HRESULT 的异常:0x80004005(E_FAIL))。毕竟,它是通过.vsct机制而不是以编程方式创建的,所以这有点说得通。
我已经没有更多想法了。请帮助我找出如何在运行时以编程方式隐藏/显示或添加/删除工具栏按钮。除了.vsct文件之外,是否还有其他定义VSPackage命令的方法?
非常感谢任何帮助。