Есть ли способ показать ContextMenu
и заблокировать дальнейшее выполнение, пока элемент не будет выбран? В частности, я хочу получить поведение, подобное ShowDialog()
, но для ContextMenu
.
Прямой подход не работает:
ContextMenu cm = new ContextMenu();
cm.MenuItems.Add("1", (s,e) => {value = 1;});
cm.Show(control, location);
, поскольку обратный вызов Click
вызывается не напрямую из Show()
, а в более поздний момент, когда цикл обработки сообщений обрабатывает событие click.
Если вам не повезло, menu
- это сборщик мусора перед обработкой события, и в этом случае событие просто молча теряется. (Это означает, что вы не можете использовать локальные переменные для ContextMenu
s таким образом.)
Кажется, это работает, но кажется "нечистым":
using (ContextMenu cm = new ContextMenu()) {
cm.MenuItems.Add("1", (s,e) => {value = 1;});
cm.Show(control, location);
Application.DoEvents();
}
Есть ли лучший способ?