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不同,后者具有Caption和TooltipText),工具提示始终设置为相同的字符串作为标题。据我了解,这是因为使用FindCommand()时,我实际上并没有获得UI按钮,而只是获得了基本命令,而这并不关心工具提示。
更令人困惑的是,当我使用TextChangesButton CommandFlag而不是TextChanges时会发生什么。该按钮现在将正确显示.vsct中定义的工具提示文本,但是当我单击另一个按钮时,标题和工具提示都不会更改-尽管当我检查btnLabel命令的Text属性时,它设置为我期望的值(“点击了x次”)。TextChangesButton是否可以“解耦”命令和按钮的属性?如果是这样,这几乎就是我想要的(我不在乎该命令,因为无论如何都没有要执行的内容;btnLabel将始终被禁用),
我浏览了各种IVs接口和SVs服务,但找不到合适的东西,而且文档(以及IntelliSense帮助)似乎也不是很广泛。
我自己回答这个问题 - 根据 VS 团队的某人的说法,新的可扩展性结构没有提供如此详细地访问控件的这些属性的方法。对于我想要实现的目标,有必要采用老式方法来获取 DTE 对象,找到我的工具栏和控件,然后将它们简单地作为 CommandBarButton 进行处理,就像我在外接程序中所做的那样。
| 归档时间: |
|
| 查看次数: |
2015 次 |
| 最近记录: |