Как программно сортировать элементы меню, добавленные пакетом VSIX в Visual Studio?

Я устанавливаю новые пункты меню, устанавливая новые пакеты vsix. Вот что у меня есть: screenshot

Я пытался изменить разные значения, чтобы VS сортировал мои пункты меню, но безуспешно. Вот часть моего файла .vsct:

<Buttons>
  <Button guid="guidWizardPackage2010Project" id="AddImpl" priority="0x0301" type="Button">
    <Parent guid="guidWizardPackage2010Project" id="MyMenuGroup" />
    <Icon guid="guidImages" id="logo" />
    <CommandFlag>DynamicVisibility</CommandFlag>
    <Strings>
      <CommandName>Add Implementation [VER]...</CommandName>
      <ButtonText>Add Implementation [VER]...</ButtonText>
    </Strings>
  </Button>
</Buttons>

...

<GuidSymbol name="guidVSPackage2012Pkg" value="{random generated}" />
<GuidSymbol name="guidWizardPackage2010Project" value="{random generated}">
  <IDSymbol name="MyMenuGroup" value="0x1020" />
  <IDSymbol name="AddImpl" value="0x0100" />
</GuidSymbol>

Я пытался увеличить такие значения, как значение «MyMenuGroup», значение «AddImpl», guids, priority="0x0301" в надежде, что одно из них используется для сортировки, но это не так.

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

Есть ли способ настроить или отсортировать пункты меню программно (автоматически)?


person Taras Kozubski    schedule 27.01.2014    source источник


Ответы (2)


Вот мое сложное решение (запускается из Package.Initialize()):

        DTE2 dte = GetGlobalService(typeof (DTE)) as DTE2;
        CommandBars commandBars = (CommandBars) dte.CommandBars;
        CommandBar projectMenu = commandBars["Project"];

        CommandBarControl control = null;
        foreach (CommandBarControl barControl in projectMenu.Controls)
            if (...) // currently added control
            {
                control = barControl;
            }
                // finding new position for the control
        control.Move(projectMenu, newPosition); // move control to correct place
        control.BeginGroup = false;             // remove ugly separator above

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

person Taras Kozubski    schedule 29.01.2014

Свойство priority управляет относительным порядком пунктов вашего меню. Странно, что у вас не работает.

person Sergey Vlasov    schedule 28.01.2014