Я разрабатываю расширение 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) не кажется очень обширной.