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