代码之家  ›  专栏  ›  技术社区  ›  TeaDrivenDev

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

  •  4
  • TeaDrivenDev  · 技术社区  · 14 年前

    我一直在为VS2008/2010开发一个Visual Studio扩展插件。新版本现在将作为一个VSIX包来完成,只适用于VS2010(无论如何它必须是.NET 4),而且我在处理UI时遇到了一些麻烦(我认为相当简单)。

    扩展主要由一个工具栏和一些按钮组成,这些按钮可以启动各种操作、表单等,还有一些按钮只能用作显示某些状态信息的标签。“label”按钮本身只显示非常简短的信息,而工具提示提供了更多细节。

    虽然我不认为整个插件的事情是非常优雅的,做这种事情是非常直接的(尽管我的方法可能有点业余)。将命令添加到工具栏时,我会将“标签”按钮“保存”在特定的局部变量中,以便以后可以随意设置标题和工具提示文本。

    在VSPackage中,相当于 Microsoft.VisualStudio.CommandBars.CommandBarButton按钮 似乎是 齐墩果酸 . 通过 没问题,但根据需要进行修改。

    为了找出如何做到这一点,我只是在一个组中有两个按钮的工具栏。 非常简单;只有一个图标和一个执行处理程序来更改另一个按钮上的文本,没有CommandFlags。 BTN标签 在.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>
    

    第一个问题是当我使用 文本更改 ,和 字符串被忽略,并且 按钮文本

    操作按钮的处理程序代码如下:

    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";
    }
    

    这将更改的标题 正如预期的那样,但是由于没有办法显式地指定工具提示( 对象只有一个 文本 属性,不同于 指挥官按钮 ,两者都有 ),工具提示始终设置为与标题相同的字符串。据我所知,这是因为使用FindCommand()我实际上并没有得到UI按钮,而是只得到底层命令,它不关心工具提示。

    文本更改按钮 文本更改 BTN标签 司令部 属性设置为我所期望的值(“单击x次”)。做 文本更改按钮 某种程度上“分离”了命令和按钮的属性?如果是这样的话,这就是我想要的(我不在乎命令,因为没有任何东西可以执行; BTNT标签

    我查看了各种IVs接口和SVs服务,但找不到合适的东西,而且文档(和IntelliSense帮助)似乎不太广泛。

    1 回复  |  直到 10 年前
        1
  •  1
  •   TeaDrivenDev    14 年前

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