我一直在为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帮助)似乎不太广泛。