我一直在开发Visual Studio扩展,作为VS2008/2010的加载项。新版本现在只能作为VS2010的VSIX包来使用(因为它必须是.NET 4),而且我在处理UI时遇到了一些麻烦(相当简单,我想)。VSPackage:在运行时修改工具栏按钮文本/工具提示
该扩展主要由一个带有一些按钮的工具栏组成,这些按钮可以启动各种动作,表单等,还有一些仅用作标签来显示某些状态信息。 “标签”按钮本身只显示非常简短的信息,而工具提示提供更多细节。
虽然我不认为整个插件是非常优雅的,但做这种事情非常简单(虽然我的方法可能有点业余)。将命令添加到工具栏时,我将“保存”特定局部变量中的“标签”按钮,以便随后可以随意设置标题和工具提示文本。
在VSPackage的,相当于Microsoft.VisualStudio.CommandBars.CommandBarButton似乎是OleMenuCommand。然而,通过MenuCommandService查找“标签”命令没有问题,但是根据需要修改它。
为了找出如何做到这一点,我只是在一个组中有两个按钮的工具栏。 btnAction很简单;只是一个图标和执行处理程序来更改另一个按钮上的文本,而不是CommandFlags。 btnLabel看起来像这样在.vsct:
<Button guid="guidVSPackageBuilderTutorialCommandSet" id="btnLabel" priority="0x0100">
<CommandFlag>DefaultDisabled</CommandFlag>
<CommandFlag>DontCache</CommandFlag>
<CommandFlag>NoCustomize</CommandFlag>
<CommandFlag>TextChanges</CommandFlag>
<CommandFlag>TextOnly</CommandFlag>
<Strings>
<CommandName>cmdidbtnLabel</CommandName>
<ButtonText>btnLabel</ButtonText>
<MenuText>btnLabel</MenuText>
<ToolTipText>Tooltip btnLabel</ToolTipText>
</Strings>
</Button>
本的第一个问题是,当我使用TextChanges,则的ToolTipText字符串被忽略,ButtonText最初用于工具提示也是如此。
的操作按钮的处理程序代码如下:
private int iClickCount = 0;
protected override void btnActionExecuteHandler(object sender, EventArgs e)
{
var svc = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
CommandID idBtnLabel = new CommandID(GuidList.guidVSPackageBuilderTutorialCmdSet, (int)PkgCmdIDList.btnLabel);
var cmd = svc.FindCommand(idBtnLabel) as OleMenuCommand;
cmd.Text = "Clicked " + (++iClickCount) + " times";
}
这改变的btnLabel标题如预期,但由于没有明确地指定提示(在OleMenuCommand对象的方式只是有一个文本属性,不像的CommandBarButton,同时具有标题和的ToolTipText),工具提示是始终使用s模式与标题相同的字符串。据我所知,这是因为使用FindCommand()我实际上并没有获得UI按钮,而只是基础命令,它不关心工具提示。
什么是更令人困惑的是当我使用TextChangesButton CommandFlag而不是TextChanges会发生什么。该按钮现在可以正确显示在.vsct中定义的工具提示文本,但是当我单击另一个按钮时,标题和工具提示都不会改变 - 尽管当我检查btnLabel命令的文本属性时,它被设置为我期望(“点击x次”)。 TextChangesButton类型的“解耦”命令的属性和按钮?如果是这样,这几乎是我想要的(我不在乎命令,因为没有什么可执行; btnLabel将始终被禁用),但我怎样才能访问按钮及其特定的字符串属性?
我查看了各种IVs接口和SVs服务,但找不到合适的东西,文档(和IntelliSense帮助)似乎并不是非常广泛。