“控件设置ContextMenuStrip属性后,第一次右击不显示菜单”解决方法

本文讨论了在使用Visual Studio界面编辑器生成的代码中,选项菜单触发对话框显示后,第一次右击面板无法弹出预设的上下文菜单的问题。通过将对话框创建逻辑移至新线程,解决了事件捕获问题。解释了为何模态对话框在不同组件点击事件中表现不同,并提供了可行的多线程解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天写一小软件的时候,遇到如标题所述问题,具体如下:

这软件有个“选项”对话框,我在主界面中的“选项”菜单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事件处理线程中创建,对其后的事件传递,有一定的影响。俺的拙见就是这样,大家若有何高见,欢迎回复。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值