VSPackage: Изменить текст кнопки / подсказки на панели инструментов во время выполнения - PullRequest
4 голосов
/ 25 октября 2010

Я разрабатываю расширение 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 * 1054 команды btnLabel * свойство, оно установлено на то, что я ожидаю («кликнул х раз»). TextChangesButton"развязывает" свойства команды и кнопки? Если это так, то это в основном то, что я хочу (мне все равно, какая команда выполнять, в любом случае, выполнять нечего; btnLabel всегда будет отключено), но как мне получить доступ к кнопке и ее кнопке? конкретные свойства строки?

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

1 Ответ

1 голос
/ 28 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...