2015-09-16 3 views
1

Мне нужно назначить комбинацию клавиш для динамического элемента меню в расширении VS 2015. Файл VSCT выглядит следующим образом:Невозможно назначить комбинацию клавиш для динамического командного меню VSIX

<?xml version="1.0" encoding="utf-8"?> 
<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <Extern href="stdidcmd.h"/> 
    <Extern href="vsshlids.h"/> 

    <Commands package="guidPackage"> 

     <Groups> 
      <Group guid="guidMenu" id="MyMenuGroup" priority="0x0600"> 
       <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/> 
      </Group> 
      <Group guid="guidSubMenu" id="MyMenuSubgroup" priority="0x0100"> 
       <Parent guid="guidMenu" id="SubMenu"/> 
      </Group> 
     </Groups> 

     <Menus> 
      <Menu guid="guidMenu" id="SubMenu" priority="0x0100" type="Menu"> 
       <Parent guid="guidMenu" id="MyMenuGroup"/> 
       <Strings> 
        <ButtonText>Minimal commands</ButtonText> 
        <CommandName>MinimalCommands</CommandName> 
       </Strings> 
      </Menu> 
     </Menus> 

     <Buttons> 
      <Button guid="guidSubMenu" id="idTest" priority="0x0100" type="Button"> 
       <Parent guid="guidSubMenu" id="MyMenuSubgroup" /> 
       <CommandFlag>DynamicItemStart</CommandFlag> 
       <Strings> 
        <ButtonText>Invoke Minimal Test</ButtonText> 
        <CommandName>MinimalTest</CommandName> 
       </Strings> 
      </Button> 
     </Buttons> 

    </Commands> 

    <Symbols> 
     <GuidSymbol name="guidPackage" value="{3e88287b-7b79-403d-ae8d-3329af218869}" /> 
     <GuidSymbol name="guidMenu" value="{c1388361-6429-452c-8ba0-580d292ef0ca}"> 
      <IDSymbol name="MyMenuGroup" value="0x1020" /> 
      <IDSymbol name="SubMenu" value="0x200"/> 
     </GuidSymbol> 
     <GuidSymbol name="guidSubMenu" value="{09E1B0D1-E466-4263-9D00-2EDCBDD954B2}"> 
      <IDSymbol name="idTest" value="0x0100" /> 
      <IDSymbol name="MyMenuSubgroup" value="0x1021"/> 
     </GuidSymbol> 
    </Symbols> 
</CommandTable> 

У меня есть код, который добавляет «Dynamic Command 1» и «Dynamic Command 2» вместо команды «Minimal Test», которую вы видите в файле .vsct. В меню отображается правильно:

Инструменты

Минимально Команды >

Dynamic Команда 1
Dynamic Command 2

Нажатие на меню вызывает обработчик. Все идет нормально.

Теперь проблема: я не вижу две динамические команды в списке Tools.Options.Keyboard. Основываясь на неотвеченном вопросе на Can one assign keyboard shortcuts to Visual Studio 2012 extensibility package commands that use DynamicItemStart?, кажется, что проблема связана с наличием пунктов меню, которые накладывают DynamicItemStart. Мой пример более сложный, потому что он использует другой GUID для подменю динамической команды. [У моего реального приложения есть командный фильтр, полученный из IOleCommandTarget. Он зависает непосредственно перед QueryStatus, если элемент DynamicItemStart находится в той же группе GUID, что и фиксированные команды.] Но я не думаю, что несколько GUID способствуют этой проблеме.

ответ

0

Следуя примеру цитируемого сообщения, я определил несколько кнопок-заполнителей, ни один из которых не имеет атрибут DynamicItemStart, но каждый из них имеет атрибуты DefaultInvisible, DynamicVisibility и TextChanges. В моем обработчике QueryStatus я использую класс OLETEXTCMD (найденный на этом сайте), чтобы изменить имя из Placeholderxxx на что-то более полезное. Меню отображается так, как я надеялся. Единственный глюк, также отмеченный в цитируемом сообщении, заключается в том, что список ярлыков клавиш использует имена Placeholderxxx. Из-за этого несовершенства я не планирую выпускать расширение (макропроцессор, который мне нужен, чтобы VS 2015 был полезен) в дикой природе.

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

Смежные вопросы