5

我一直在开发一个 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>

第一个问题是,当我使用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对象只有一个Text属性,与CommandBarButton不同,后者同时具有CaptionTooltipText),工具提示始终设置为相同的字符串作为标题。据我了解,这是因为使用 FindCommand() 我实际上并没有获得 UI 按钮,而只是获得了与工具提示无关的底层命令。

更令人困惑的是,当我使用TextChangesButton CommandFlag 而不是TextChanges时会发生什么。该按钮现在将正确显示 .vsct 中定义的工具提示文本,但是当我单击另一个按钮时,标题和工具提示都不会改变 - 尽管当我检查btnLabel命令的Text属性时,它被设置为我所期望的(“点击 x 次”)。TextChangesButton是否将命令和按钮的属性“解耦”?如果是这样,这几乎就是我想要的(我不关心命令,因为无论如何都没有执行任何操作;btnLabel将始终被禁用),

我浏览了各种 IVs 接口和 SVs 服务,但找不到合适的东西,并且文档(和 IntelliSense 帮助)似乎不是很广泛。

4

1 回答 1

1

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

于 2010-10-28T10:21:26.070 回答