VSPackage:在运行时修改工具栏按钮文本/工具提示

Tea*_*Dev 5 visual-studio-2010 vspackage visual-studio vsix

我一直在开发Visual Studio扩展作为VS2008 / 2010的加载项。现在,新版本只能作为VS2010的VSIX软件包来完成(因为它无论如何都必须是.NET 4),而且我在UI处理方面遇到了一些麻烦(我认为很简单)。

该扩展程序主要由一个工具栏组成,该工具栏包含一些用于启动各种操作,表单等的按钮,以及一些仅用作显示某些状态信息的标签。“标签”按钮本身仅显示非常简短的信息,而工具提示提供了更多详细信息。

尽管我并不认为整个Add-in东西很优雅,但是进行这种事情非常简单(尽管我的方法可能有点业余)。在将命令添加到工具栏时,我将“标签”按钮“保存”在特定的局部变量中,以便以后可以随意设置标题和工具提示文本。

在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>
Run Code Online (Sandbox Code Playgroud)

这样做的第一个问题是,当我使用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";
}
Run Code Online (Sandbox Code Playgroud)

将按预期方式更改btnLabel的标题,但是由于无法显式指定工具提示(OleMenuCommand对象仅具有Text属性,与CommandBarButton不同,后者具有CaptionTooltipText),工具提示始终设置为相同的字符串作为标题。据我了解,这是因为使用FindCommand()时,我实际上并没有获得UI按钮,而只是获得了基本命令,而这并不关心工具提示。

更令人困惑的是,当我使用TextChangesButton CommandFlag而不是TextChanges时会发生什么。该按钮现在将正确显示.vsct中定义的工具提示文本,但是当我单击另一个按钮时,标题和工具提示都不会更改-尽管当我检查btnLabel命令的Text属性时,它设置为我期望的值(“点击了x次”)。TextChangesButton是否可以“解耦”命令和按钮的属性?如果是这样,这几乎就是我想要的(我不在乎该命令,因为无论如何都没有要执行的内容;btnLabel将始终被禁用),

我浏览了各种IVs接口和SVs服务,但找不到合适的东西,而且文档(以及IntelliSense帮助)似乎也不是很广泛。

Tea*_*Dev 1

我自己回答这个问题 - 根据 VS 团队的某人的说法,新的可扩展性结构没有提供如此详细地访问控件的这些属性的方法。对于我想要实现的目标,有必要采用老式方法来获取 DTE 对象,找到我的工具栏和控件,然后将它们简单地作为 CommandBarButton 进行处理,就像我在外接程序中所做的那样。