Комбинация панели инструментов Visual Studio 2015, как правильно управлять введенным пользователем значением?

Я определил динамическое комбо для панели инструментов в пакете VSIX для Visual Studio 2015, используя этот параметр в файле VSCT:

  <Combo guid="cmdExplorerToolbarSearchGUID" id="cmdExplorerToolbarSearchID" priority="0x0" type="DynamicCombo"
      defaultWidth="50" idCommandList="cmdExplorerToolbarSearchGetListID">
    <Parent guid="grpExplorerToolbar3GUID" id="grpExplorerToolbar3ID" />
    <CommandFlag>DynamicVisibility</CommandFlag>
    <CommandFlag>IconAndText</CommandFlag>
    <CommandFlag>StretchHorizontally</CommandFlag>
    <Strings>
      <CanonicalName>cmdExplorerToolbarSearch</CanonicalName>
      <ButtonText>Search</ButtonText>
      <ToolTipText>Search elements in the model explorer</ToolTipText>
    </Strings>
  </Combo>

</Combos>

Соответствующий DynamicStatusMenuCommand экземпляры определяются следующим образом:

    command = new DynamicStatusMenuCommand(
        new EventHandler(this.OnPopUpMenuDisplayAction),
        new EventHandler(this.OnCmdExplorerToolbarSearchSelected),
        new CommandID(CmdExplorerToolbarSearchGUID, CmdExplorerToolbarSearchID));
    commands.Add(command);

    command = new DynamicStatusMenuCommand(
        new EventHandler(this.OnPopUpMenuDisplayAction),
        new EventHandler(this.OnCmdExplorerToolbarSearchGetList),
        new CommandID(CmdExplorerToolbarSearchGUID, CmdExplorerToolbarSearchGetListID));
    commands.Add(command);

И, наконец, OnCmdExplorerToolbarSearchSelected обработчик событий, подобный этому:

private void OnCmdExplorerToolbarSearchSelected(object sender, EventArgs e)
{
    // Process the event arguments

    OleMenuCmdEventArgs args = e as OleMenuCmdEventArgs;
    if (args != null)
    {
        // Process values

        string inValue = args.InValue as string;
        IntPtr outValue = args.OutValue;

        if (outValue != IntPtr.Zero)
        {
            // When outValue is not null, the IDE is requesting the current value for the combo

            Marshal.GetNativeVariantForObject(this.SearchHandler.CurrentValue, outValue);
        }
        else if (inValue != null)
        {
            this.SearchHandler.Search(this.PresentationModel3ExplorerToolWindow.Explorer, inValue);
        }
    }
}

Это приводит к хорошей комбинации в наборе инструментов:

Print-screen панели инструментов

Проблема в том, что если пользователь, например, вводит "Блок" и нажимает Enter обработчик события вызывается с помощью inValue!= null, и поиск выполняется. Но если, тогда, он вводит что-то еще (например: клиент) и нажимает Tab (нет Enter), комбо возвращается к предыдущему значению ("Unit"), потому что обработчик вызывается с args.OutValue!= IntPtr.Zero.

Какой прием для обратного вызова, когда пользователь вводит что-то и перемещает фокус от комбо, не нажимая Enter? И, учитывая это, как я могу получить значение, которое находится на комбо в данный момент?

1 ответ

Я не пробовал этого, но если вы устанавливаете свою команду с помощью OleMenuCommand, вы можете предоставить обработчик "Изменено", который, кажется, должен вызываться всякий раз, когда изменяется текст в поле со списком. Это может позволить вам делать то, что вы хотите?

Другие вопросы по тегам