【发布时间】:2011-12-06 16:03:47
【问题描述】:
有没有办法显示ContextMenu 并阻止进一步执行,直到选择了一个项目?特别是,我希望获得类似于 ShowDialog() 的行为,但对于 ContextMenu。
直截了当的方法行不通:
ContextMenu cm = new ContextMenu();
cm.MenuItems.Add("1", (s,e) => {value = 1;});
cm.Show(control, location);
因为Click 回调不是直接从Show() 调用,而是在稍后消息循环处理点击事件时调用。
如果你不走运,menu 在事件处理之前被垃圾收集,在这种情况下,事件只是默默地丢失。 (这意味着您不能以这种方式真正为ContextMenus 使用局部变量。)
这似乎有效,但感觉“不干净”:
using (ContextMenu cm = new ContextMenu()) {
cm.MenuItems.Add("1", (s,e) => {value = 1;});
cm.Show(control, location);
Application.DoEvents();
}
有没有更好的办法?
【问题讨论】:
-
没有。将 Show() 调用之后的任何代码移动到 Collapse 事件的事件处理程序中。或者使用表单,以便您可以使用 ShowDialog。
标签: c# .net winforms garbage-collection contextmenu