ContextMenu
を表示し、アイテムが選択されるまでさらに実行をブロックする方法はありますか?特に、私はShowDialog()
に似ているが、ContextMenu
に似た行動をしたい。「ブロッキング」WinForms ContextMenuを表示する方法はありますか?
簡単な方法は動作しません:
ContextMenu cm = new ContextMenu();
cm.MenuItems.Add("1", (s,e) => {value = 1;});
cm.Show(control, location);
メッセージループは、クリックイベントを処理するときClick
コールバックがShow()
から直接呼び出す代わりに、いくつかの後の時点でされていないため。
不運な場合は、イベントが処理される前にmenu
がガベージコレクションされます。この場合、イベントはただ静かに失われます。 (あなたが本当にこの方法でContextMenu
秒間ローカル変数を使用することはできません意味。)
これが動作しているようですが、「汚れた」感じている:
using (ContextMenu cm = new ContextMenu()) {
cm.MenuItems.Add("1", (s,e) => {value = 1;});
cm.Show(control, location);
Application.DoEvents();
}
良い方法はありますか?
いいえ、Show()コールの後にCollapseイベントのイベントハンドラに移動したコードはすべて移動します。または、ShowDialogを使用できるようにフォームを使用します。 –