VSPackage: изменение текста/подсказки кнопки панели инструментов во время выполнения

Я разрабатываю расширение Visual Studio в качестве надстройки для VS2008/2010. Новая версия теперь должна быть сделана как пакет VSIX только для VS2010 (так как в любом случае это должна быть .NET 4), и у меня возникают некоторые проблемы с (я думаю, довольно простой) обработкой пользовательского интерфейса.

Расширение в основном состоит из панели инструментов с некоторыми кнопками, которые запускают различные действия, формы и т. д., и несколькими, которые используются только в качестве меток для отображения некоторой информации о состоянии. Кнопки «метки» сами по себе просто показывают очень краткую и сжатую информацию, в то время как всплывающие подсказки предоставляют более подробную информацию.

Хотя я не думал, что вся эта надстройка очень элегантна, делать такие вещи было довольно просто (хотя мой подход, возможно, был немного дилетантским). При добавлении команд на панель инструментов я «сохранял» кнопки «метки» в определенных локальных переменных, что позволяло мне позже устанавливать заголовок и текст всплывающей подсказки по желанию.

В VSPackage эквивалентом Microsoft.VisualStudio.CommandBars.CommandBarButton является OleMenuCommand. Найти команду "label" с помощью 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 просто имеет свойство Text , в отличие от CommandBarButton, у которого есть и Caption, и TooltipText), для всплывающей подсказки всегда устанавливается та же строка, что и для заголовка. Насколько я понимаю, это потому, что с FindCommand() я на самом деле не получаю кнопку пользовательского интерфейса, а только базовую команду, которая не заботится о всплывающих подсказках.

Еще больше сбивает с толку то, что происходит, когда я использую TextChangesButton CommandFlag вместо TextChanges. Кнопка теперь будет правильно отображать текст всплывающей подсказки, определенный в .vsct, но ни заголовок, ни всплывающая подсказка не изменятся, когда я нажму другую кнопку — хотя, когда я проверяю Text< команды btnLabel /em> установлено то, что я ожидаю («Нажато x раз»). Разделяет ли TextChangesButton свойства команды и кнопки? Если это так, то это в значительной степени то, что я хочу (мне не нужна команда, так как все равно нечего выполнять; btnLabel всегда будет отключен), но как я могу получить доступ к кнопке и его конкретные строковые свойства?

Я просмотрел различные интерфейсы IV и службы SV, но не смог найти что-то подходящее, а документация (и справка IntelliSense) не кажется очень обширной.


person TeaDrivenDev    schedule 25.10.2010    source источник


Ответы (1)


Чтобы ответить на это самому - по словам кого-то из команды VS, новая структура расширяемости не предлагает способов доступа к этим свойствам элементов управления в таких деталях. Для того, чего я хочу достичь, необходимо будет пойти старомодным способом получить объект DTE, найти мою панель инструментов и мои элементы управления и просто обработать их как CommandBarButtons, как я сделал в своей надстройке.

person TeaDrivenDev    schedule 28.10.2010