visual-studio - VSPackage:在运行时修改工具栏按钮文本/工具提示

标签 visual-studio visual-studio-2010 vsix vspackage

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

第一个问题是当我使用 文本更改 , ToolTipText 字符串被忽略,ButtonText 最初也用于工具提示。

Action 按钮的处理程序代码如下:

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 不同,它同时具有 Caption 和 TooltipText),因此工具提示始终设置为相同的字符串作为标题。据我了解,这是因为使用 FindCommand() 我实际上并没有获得 UI 按钮,而只是获得了与工具提示无关的底层命令。

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

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

最佳答案

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

关于visual-studio - VSPackage:在运行时修改工具栏按钮文本/工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014822/

相关文章:

android - 如何通过visual studio运行eclipse android模拟器

c++ - 如何将解决方案从 Visual Studio 2010 降级到 Visual Studio 2005?

visual-studio - 如何分析 vs2008/10 中的特定代码块?

c++ - 视频所有帧的直方图的K均值聚类

visual-studio-2015 - 无法在 Visual Studio 2017 (VS 2017) 的 DLL '?' 中找到名为 'PkgdefMgmt.dll' 的入口点

visual-studio-2010 - 在 VS 2010 中找不到 VSIX 项目类型

c - 三元表达式 VC2008 的解析无效?

c# - WIX 安装程序,更改从另一个程序选择的安装文件夹?

c# - 无效操作异常 : Sequence contains more than one element

visual-studio-2010 - 如何使用 MEF 部署 MSBuild 自定义任务?