我一直在开发Visual Studio扩展,作为VS2008 / 2010的插件。新版本现在只作为VS2010的VSIX软件包完成(因为它必须是.NET 4),而且我遇到了一些麻烦(相当简单,我认为)UI处理。
扩展程序主要包括一个工具栏,其中包含一些启动各种操作,表单等的按钮,以及一些仅用作显示某些状态信息的标签的工具栏。 “标签”按钮本身只显示非常简短的信息,而工具提示则提供更多细节。
虽然我不认为整个插件的东西非常优雅,但做这种东西非常简单(虽然我的方法可能有点业余)。将命令添加到工具栏时,我会在特定的局部变量中“保存”“标签”按钮,以便稍后设置标题和工具提示文本。
在VSPackage中, Microsoft.VisualStudio.CommandBars.CommandBarButton 的等效项似乎是 OleMenuCommand 。通过 MenuCommandService 查找“label”命令没有问题,但是根据需要进行修改。
为了找到如何做到这一点,我只有一个工具栏,在一个组中有两个按钮。 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 对象只有文本 property,与 CommandBarButton 不同,它同时具有 Caption 和 TooltipText ),工具提示始终设置为与标题相同的字符串。根据我的理解,这是因为使用FindCommand()我实际上并没有获得UI按钮,而只是底层命令,它不关心工具提示。
当我使用 TextChangesButton CommandFlag而不是 TextChanges 时会发生什么更令人困惑的事情。该按钮现在将正确显示.vsct中定义的工具提示文本,但是当我单击另一个按钮时,标题和工具提示都不会改变 - 但是当我检查 btnLabel 命令的 Text <时/ em>属性,它设置为我所期望的(“Clicked x times”)。 TextChangesButton 类似于“解耦”命令和按钮的属性吗?如果是这样,这几乎是我想要的(我不关心命令,因为无论如何都无法执行; btnLabel 将始终被禁用),但是如何访问按钮和它的特定字符串属性?
我查看了各种IVs接口和SVs服务,但找不到合适的东西,文档(和IntelliSense帮助)似乎不是很广泛。
答案 0 :(得分:1)
要自己回答这个问题 - 根据VS团队的某些人的说法,新的可扩展性结构不提供如此详细地访问控件的这些属性的方法。对于我想要实现的目标,有必要采用老式的方式来获取DTE对象,找到我的工具栏和我的控件,并将它们作为CommandBarButtons处理,就像我在我的插件中一样。