2016-01-25 15 views
7

ich eine dynamische Kombination für eine Symbolleiste in einem VSIX Paket für Visual Studio 2015 mit dieser Einstellung in der VSCT-Datei definiert haben:Visual Studio 2015 Toolbar Combo, wie man den vom Benutzer korrekt eingegebenen Wert verwaltet?

<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> 

Die entsprechenden DynamicStatusMenuCommand Instanzen wie folgt definiert sind:

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); 

und schließlich die OnCmdExplorerToolbarSearchSelected Event-Handler wie folgt aus:

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); 
     } 
    } 
} 

Dies führt zu eine nette Combo in der Toolbox:

Print-screen of the toolbar

Das Problem ist, dass, wenn der Benutzer zum Beispiel „Einheit“ eintritt und drückt Enter die Ereignishandler inValue aufgerufen = null und die Suche durchgeführt wird!. Wenn er jedoch etwas anderes eingibt (z. B. Kunde) und Tab (keine Enter) drückt, kehrt die Combo zum vorherigen Wert ("Unit") zurück, da der Handler mit args.OutValue! = IntPtr.Zero aufgerufen wird.

Was ist der Trick, um einen Rückruf zu erhalten, wenn der Benutzer etwas eingibt und den Fokus weg von der Kombination verschiebt, ohne Enter zu drücken? Und wie kann ich den Wert bekommen, der in diesem Moment in der Combo ist?

Antwort

0

Ich habe das nicht versucht, aber wenn Sie Ihren Befehl mit einem OleMenuCommand installieren, können Sie einen "Changed" -Handler bereitstellen, der anscheinend immer aufgerufen werden soll, wenn sich der Text im Kombinationsfeld ändert. Damit können Sie tun, was Sie wollen?

Verwandte Themen