Поделиться через


Добавление контроллера меню на панель инструментов

В этом пошаговом руководстве показано , как добавить панель инструментов в пошаговое руководство по добавлению контроллера меню на панель инструментов. Описанные здесь действия также можно применить к панели инструментов, созданной в пошаговом руководстве по добавлению панели инструментов .

Контроллер меню — это разделенный элемент управления. В левой части контроллера меню отображается последняя используемая команда, и ее можно запустить, щелкнув ее. Справа от контроллера меню — стрелка, которая при щелчке открывает список дополнительных команд. Щелкнув команду в списке, команда выполняется и заменяет команду слева от контроллера меню. Таким образом, контроллер меню работает как кнопка команды, которая всегда показывает последнюю команду из списка.

Контроллеры меню могут отображаться в меню, но они чаще всего используются на панелях инструментов.

Создание контроллера меню

  1. Следуйте инструкциям, описанным в разделе "Добавление панели инструментов" в окно инструментов, чтобы создать окно инструментов с панелью инструментов.

  2. В 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" />
    
  3. В разделе "Меню" после последней записи меню определите контроллер меню в качестве меню.

    <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 включить контроллер меню, необходимо включить флаги, чтобы отразить последнюю выбранную команду.

  4. В разделе "Группы" после последней записи группы добавьте группу контроллеров меню.

    <Group guid="guidTWTestCommandPackageCmdSet" id="TestMenuControllerGroup" priority="0x000">
        <Parent guid="guidTWTestCommandPackageCmdSet" id="TestMenuController" />
    </Group>
    

    Задав контроллер меню в качестве родительского элемента, все команды, помещенные в эту группу, отображаются в контроллере меню. Атрибут priority опущен, который задает значение по умолчанию 0, так как это единственная группа в контроллере меню.

  5. В разделе "Кнопки" после последней кнопки добавьте элемент 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>
    
  6. На этом этапе можно посмотреть на контроллер меню. Выполните сборку решения и запустите отладку. Вы увидите экспериментальный экземпляр.

    1. В меню "Вид" или "Другие окна" откройте средство тестированияWindow.

    2. Контроллер меню отображается на панели инструментов в окне инструментов.

    3. Щелкните стрелку в правой части контроллера меню, чтобы увидеть три возможные команды.

      Обратите внимание, что при нажатии команды заголовок контроллера меню изменяется, чтобы отобразить эту команду. В следующем разделе мы добавим код для активации этих команд.

Реализация команд контроллера меню

  1. В TWTestCommandPackageGuids.cs добавьте идентификаторы команд для трех элементов меню после существующих идентификаторов команд.

    public const int cmdidMCItem1 = 0x130;
    public const int cmdidMCItem2 = 0x131;
    public const int cmdidMCItem3 = 0x132;
    
  2. В TWTestCommand.cs добавьте следующий код в верхней части TWTestCommand класса.

    private int currentMCCommand; // The currently selected menu controller command
    
  3. В конструкторе 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;
        }
    }
    
  4. Добавьте обработчик событий в класс TWTestCommand, чтобы пометить выбранную команду как проверка.

    private void OnMCItemQueryStatus(object sender, EventArgs e)
    {
        OleMenuCommand mc = sender as OleMenuCommand;
        if (null != mc)
        {
            mc.Checked = (mc.CommandID.ID == this.currentMCCommand);
        }
    }
    
  5. Добавьте обработчик событий, который отображает 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);
        }
    }
    

Тестирование контроллера меню

  1. Выполните сборку решения и запустите отладку. Вы увидите экспериментальный экземпляр.

  2. Откройте средство тестированияWindow в меню "Вид" или "Другие окна".

    Контроллер меню отображается на панели инструментов в окне инструментов и отображает элемент MC 1.

  3. Нажмите кнопку контроллера меню слева от стрелки.

    Вы увидите три элемента, первое из которых выбрано и имеет поле выделения вокруг значка. Щелкните ЭЛЕМЕНТ MC 3.

    Откроется диалоговое окно с сообщением о выбранном элементе контроллера меню 3. Обратите внимание, что сообщение соответствует тексту кнопки контроллера меню. Теперь в кнопке контроллера меню отображается элемент MC 3.