【发布时间】:2009-10-07 10:01:55
【问题描述】:
当有人按下“Alt-A”时,我正在使用以下代码在我的表单上显示上下文菜单:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Alt && e.KeyCode == Keys.A)
{
ContextMenuStrip menu = new ContextMenuStrip();
ToolStripMenuItem item = new ToolStripMenuItem("Hello &World");
item.Click += new EventHandler(item_Click);
menu.MenuItems.Add(item);
ToolStripMenuItem item2 = new ToolStripMenuItem("Some &Andriod");
item2.Click +=new EventHandler(item_Click);
menu.MenuItems.Add(item2);
menu.Show(this, new Point(0,0));
}
}
void item_Click(object sender, EventArgs e)
{
MessageBox.Show("Hey!")
}
我遇到的问题是第二个菜单项(“Some &Android”)在菜单显示后立即被“点击” - 显然是因为按键(Alt-A)被立即传递给菜单。
如果我将该菜单项更改为具有不同的助记符(例如“&Some Android”),则不会发生这种情况,并且菜单会正常显示。
我知道 ContextMenu 类已被弃用,但有什么方法可以防止这种行为吗?我已经尝试将 EventArgs 的 Handled 属性设置为 true,但什么也没做(大概是因为在事件处理程序完成之前不会做任何事情,并且 Show() 方法会暂停执行,直到不再显示 ContextMenu。
更新:我已经更新了代码以使用较新的 ContextMenuStrip 类并发现发生了同样的事情,但是 ContextMenuStrip 类为我提供了更多方法来覆盖允许更好地控制菜单项。
我注意到,使用 ContextMenuStrip 类时,Show() 方法会立即返回(同时仍显示菜单),但是即使将事件 args 上的 Handled 属性设置为 true 也不会阻止按键被处理通过上下文菜单。
我正在考虑使用一些更复杂的逻辑来决定是否根据自显示菜单以来是否经过某个时间间隔以及此后是否处理了 KeyUp 事件来触发 click 事件,但是这一切看起来都非常混乱 - 肯定有人以前遇到过这个问题吗?
【问题讨论】:
标签: c# contextmenu