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