2010-10-25 63 views
4

我一直在开发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帮助)似乎并不是非常广泛。

回答

1

为了回答这个问题 - 根据VS团队的人员的说法,新的可扩展性结构不提供访问这些控件属性的方法。对于我想实现的目标,有必要采用老式的方式来获取DTE对象,找到我的工具栏和我的控件,并简单地将它们作为CommandBarButton来处理,就像我在加载项中那样。