私はVSCTファイルでこの設定を使用して、Visual Studioの2015年VSIXパッケージ内のツールバーのための動的なコンボを定義している:Visual Studio 2015ツールバーのコンボ、ユーザーが正しく入力した値を管理する方法?
<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);
}
}
}
これは、その結果ツールボックスでの素敵なコンボは:!
問題は=ユーザーは、例えば、「ユニット」を入力し、Enter
押した場合は、イベントハンドラがinvalueパラメータと呼ばれていることをnullで、検索が実行されます。しかし、何か他のもの(例:Customer)を入力してTab
(Enter
)を押すと、ハンドラはargs.OutValue!= IntPtr.Zeroで呼び出されるため、コンボは前の値( "Unit")に戻ります。
ユーザが何かを入力してフォーカスをコンボから離したときにコールバックを取得する方法は、Enter
を押すことなくですか?それで、その瞬間にコンボにある価値をどのように得ることができるのですか?