今天写一小软件的时候,遇到如标题所述问题,具体如下:
这软件有个“选项”对话框,我在主界面中的“选项”菜单Click事件中创建并显示该对话框,代码如下:
private void ToolStripMenuItem_Options_Click(object sender, EventArgs e)
{
Form1 form = new Form1();
form.ShowDialog(this);
}
在这个选项对话框中,有个Panel,我为其关联一个上下文菜单,即设置了其ContextMenuStrip属性,大致代码如下(代码是生成器生成的,这里只贴出关键部分):
ContextMenuStrip contextMenuStrip1 = new ContextMenuStrip(this.components);
//...添加一些ToolStripMenuItem.
panel1.ContextMenuStrip = this.contextMenuStrip1;
如此简单之代码,何况又是用VS的界面编辑器生成的,不料出现灰常郁闷之现象:点击“选项”菜单跳出对话框后,第一次右击panel1,居然并没有弹出菜单,之后右击则正常。
经过各种尝试,发现:ToolStripMenuItem的Click事件处理函数中创建对话框并处理子对话框的ToolStripMenuItem的Click事件,存在第一个事件捕获不到的问题。解决方法是:通过在ToolStripMenuItem的Click事件中另启线程来创建并显示对话框,就没问题了,代码如下:
private void ToolStripMenuItem_Options_Click(object sender, EventArgs e)
{
Thread thread = new Thread(() =>
{
Form1 form = new Form1();
form.ShowDialog(this);
});
thread.Start();
}
虽然问题得已解决,不过我并不清楚其中的原因。如果说原来在click中创建模态对话框,影响事件传递也不对,因为我改成非模态对话框也不行。且button的click也是模态,可是却没问题。只能说对话框在新线程中创建,与在ToolStripMenuItem的Click事件处理线程中创建,对其后的事件传递,有一定的影响。俺的拙见就是这样,大家若有何高见,欢迎回复。