VSPackage的:修改工具栏按钮文/提示在运行时
-
26-09-2019 - |
题
我一直在开发一个Visual Studio扩展作为一个附加在用于VS2008 / 2010。新版本现在要做的VSIX包VS2010只是(因为它是.NET 4反正),和我有一些麻烦与(很简单,我想)UI处理。
扩展主要由一些按钮时启动的各种动作,形式等,并且一些是只用作标记,以显示一些状态信息的工具栏。 “标签”按钮本身只显示非常短的和简明的信息,而工具提示提供更多的细节。
虽然我不认为整个外接事情是非常优雅的,做这种东西是非常简单的(虽然我的做法可能已经有点业余)。当添加命令到工具栏,我将“保存”,在特定的局部变量“标签”按钮,让我以后设置随意的标题和工具提示文本。
在一个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 对象只是有一个文本方式EM>属性,不同于的CommandBarButton ,其具有两个标题和的ToolTipText ),工具提示总是被设置为相同的字符串作为标题。据我了解,这是因为与FindCommand()我没有实际得到的UI按钮,但只有基本的命令,它不关心提示。
什么是更令人困惑的是当我使用 TextChangesButton CommandFlag,而不是发生了什么 TextChanges 。该按钮现在将正确显示.vsct定义提示文本,但是当我点击另一个按钮无论是标题还是提示将改变 - 尽管当我检查的 btnLabel 的命令的的文本的属性,它被设置为我所期望的(“被点击的X倍”)。确实的 TextChangesButton 强>的一种“解耦”的命令和该按钮的属性?如果是这样,其实这就是我想要的(我不关心的命令,没有什么反正执行; btnLabel 的永远是禁用的),但我怎么能访问按钮,其特定的串属性?
我通过不同的IV接口和SV的服务看了,但找不到合适的东西,和文档(和智能感知帮助)似乎并不很广泛的。
解决方案
要回答这个问题我自己 - 根据来自森林狼队的人,新的可扩展结构不访问提供方式这样的细节控制这些属性。对于我要实现,有必要去获得DTE对象的保持,发现我的工具栏的老式的方法和我的控制,只是将它们作为CommandBarButtons,正如我在外接一样。