Добавление контроллера меню на панель инструментов
В этом пошаговом руководстве показано , как добавить панель инструментов в пошаговое руководство по добавлению контроллера меню на панель инструментов. Описанные здесь действия также можно применить к панели инструментов, созданной в пошаговом руководстве по добавлению панели инструментов .
Контроллер меню — это разделенный элемент управления. В левой части контроллера меню отображается последняя используемая команда, и ее можно запустить, щелкнув ее. Справа от контроллера меню — стрелка, которая при щелчке открывает список дополнительных команд. Щелкнув команду в списке, команда выполняется и заменяет команду слева от контроллера меню. Таким образом, контроллер меню работает как кнопка команды, которая всегда показывает последнюю команду из списка.
Контроллеры меню могут отображаться в меню, но они чаще всего используются на панелях инструментов.
Создание контроллера меню
Следуйте инструкциям, описанным в разделе "Добавление панели инструментов" в окно инструментов, чтобы создать окно инструментов с панелью инструментов.
В TWTestCommandPackage.vsct перейдите в раздел "Символы". В элементе GuidSymbol с именем guidTWTestCommandPackageCmdSet объявите контроллер меню, группу контроллеров меню и три пункта меню.
<IDSymbol name="TestMenuController" value="0x1300" /><IDSymbol name="TestMenuControllerGroup" value="0x1060" /><IDSymbol name="cmdidMCItem1" value="0x0130" /><IDSymbol name="cmdidMCItem2" value="0x0131" /><IDSymbol name="cmdidMCItem3" value="0x0132" />
В разделе "Меню" после последней записи меню определите контроллер меню в качестве меню.
<Menu guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" priority="0x0100" type="MenuController"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TWToolbarGroup" /> <CommandFlag>IconAndText</CommandFlag> <CommandFlag>TextChanges</CommandFlag> <CommandFlag>TextIsAnchorCommand</CommandFlag> <Strings> <ButtonText>Test Menu Controller</ButtonText> <CommandName>Test Menu Controller</CommandName> </Strings> </Menu>
TextIsAnchorCommand
ЧтобыTextChanges
включить контроллер меню, необходимо включить флаги, чтобы отразить последнюю выбранную команду.В разделе "Группы" после последней записи группы добавьте группу контроллеров меню.
<Group guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" priority="0x000"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" /> </Group>
Задав контроллер меню в качестве родительского элемента, все команды, помещенные в эту группу, отображаются в контроллере меню. Атрибут
priority
опущен, который задает значение по умолчанию 0, так как это единственная группа в контроллере меню.В разделе "Кнопки" после последней кнопки добавьте элемент Button для каждого элемента меню.
<Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem1" priority="0x0000" type="Button"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" /> <Icon guid="guidImages" id="bmpPic1" /> <CommandFlag>IconAndText</CommandFlag> <Strings> <ButtonText>MC Item 1</ButtonText> <CommandName>MC Item 1</CommandName> </Strings> </Button> <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem2" priority="0x0100" type="Button"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" /> <Icon guid="guidImages" id="bmpPic2" /> <CommandFlag>IconAndText</CommandFlag> <Strings> <ButtonText>MC Item 2</ButtonText> <CommandName>MC Item 2</CommandName> </Strings> </Button> <Button guid="guidTWTestCommandPackageCmdSet" id="cmdidMCItem3" priority="0x0200" type="Button"> <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" /> <Icon guid="guidImages" id="bmpPicSearch" /> <CommandFlag>IconAndText</CommandFlag> <Strings> <ButtonText>MC Item 3</ButtonText> <CommandName>MC Item 3</CommandName> </Strings> </Button>
На этом этапе можно посмотреть на контроллер меню. Выполните сборку решения и запустите отладку. Вы увидите экспериментальный экземпляр.
В меню "Вид" или "Другие окна" откройте средство тестированияWindow.
Контроллер меню отображается на панели инструментов в окне инструментов.
Щелкните стрелку в правой части контроллера меню, чтобы увидеть три возможные команды.
Обратите внимание, что при нажатии команды заголовок контроллера меню изменяется, чтобы отобразить эту команду. В следующем разделе мы добавим код для активации этих команд.
Реализация команд контроллера меню
В TWTestCommandPackageGuids.cs добавьте идентификаторы команд для трех элементов меню после существующих идентификаторов команд.
public const int cmdidMCItem1 = 0x130; public const int cmdidMCItem2 = 0x131; public const int cmdidMCItem3 = 0x132;
В TWTestCommand.cs добавьте следующий код в верхней части
TWTestCommand
класса.private int currentMCCommand; // The currently selected menu controller command
В конструкторе TWTestCommand после последнего вызова
AddCommand
метода добавьте код для маршрутизации событий для каждой команды с помощью одного и того же обработчика.for (int i = TWTestCommandPackageGuids.cmdidMCItem1; i <= TWTestCommandPackageGuids.cmdidMCItem3; i++) { CommandID cmdID = new CommandID(new Guid(TWTestCommandPackageGuids.guidTWTestCommandPackageCmdSet), i); OleMenuCommand mc = new OleMenuCommand(new EventHandler(OnMCItemClicked), cmdID); mc.BeforeQueryStatus += new EventHandler(OnMCItemQueryStatus); commandService.AddCommand(mc); // The first item is, by default, checked. if (TWTestCommandPackageGuids.cmdidMCItem1 == i) { mc.Checked = true; this.currentMCCommand = i; } }
Добавьте обработчик событий в класс TWTestCommand, чтобы пометить выбранную команду как проверка.
private void OnMCItemQueryStatus(object sender, EventArgs e) { OleMenuCommand mc = sender as OleMenuCommand; if (null != mc) { mc.Checked = (mc.CommandID.ID == this.currentMCCommand); } }
Добавьте обработчик событий, который отображает MessageBox, когда пользователь выбирает команду в контроллере меню:
private void OnMCItemClicked(object sender, EventArgs e) { OleMenuCommand mc = sender as OleMenuCommand; if (null != mc) { string selection; switch (mc.CommandID.ID) { case c.cmdidMCItem1: selection = "Menu controller Item 1"; break; case TWTestCommandPackageGuids.cmdidMCItem2: selection = "Menu controller Item 2"; break; case TWTestCommandPackageGuids.cmdidMCItem3: selection = "Menu controller Item 3"; break; default: selection = "Unknown command"; break; } this.currentMCCommand = mc.CommandID.ID; IVsUIShell uiShell = (IVsUIShell) ServiceProvider.GetService(typeof(SVsUIShell)); Guid clsid = Guid.Empty; int result; uiShell.ShowMessageBox( 0, ref clsid, "Test Tool Window Toolbar Package", string.Format(CultureInfo.CurrentCulture, "You selected {0}", selection), string.Empty, 0, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO, 0, out result); } }
Тестирование контроллера меню
Выполните сборку решения и запустите отладку. Вы увидите экспериментальный экземпляр.
Откройте средство тестированияWindow в меню "Вид" или "Другие окна".
Контроллер меню отображается на панели инструментов в окне инструментов и отображает элемент MC 1.
Нажмите кнопку контроллера меню слева от стрелки.
Вы увидите три элемента, первое из которых выбрано и имеет поле выделения вокруг значка. Щелкните ЭЛЕМЕНТ MC 3.
Откроется диалоговое окно с сообщением о выбранном элементе контроллера меню 3. Обратите внимание, что сообщение соответствует тексту кнопки контроллера меню. Теперь в кнопке контроллера меню отображается элемент MC 3.