我想将MouseEventArgs重置为始终只运行一次。 如果有人多次单击该按钮(10次),则程序运行10次,依此类推。
我的代码效果不佳,因为如果有人点击按钮1次,则会运行2次或更多次。 我想重置MouseEventArgs或做其他解决方案。
Windows窗体应用程序(XP,32位)
private void button1_MouseClick(object sender, MouseEventArgs e)
{
button1.Enabled = false;
button1.MouseClick -= button1_MouseClick;
mc++;
if (true)
{
button1.Enabled = false;
//button1.Location = new Point(40, 40);
//Point location = button1.Location;
//location.X = 0; location.Y = 0;
System.Threading.Thread.Sleep(2000);
if (mc == 1)
{
//button1.Location = new Point(67, 191);
//location.X = 67; location.Y = 191;
mc = 0;
button1.Enabled = true;
button1.MouseClick += button1_MouseClick;
textBox1.AppendText("Click " + e.Clicks + ", Clicks: " + mc + "\n");
}
}
}
答案 0 :(得分:1)
您正尝试在主线程上执行一些长时间运行的作业。 看起来您可能看起来禁用了按钮,但应忽略后续点击,但它们实际上已放入队列中。如果你看一下事件队列,那么当按钮被启用时,每次点击都会完成:
Click
Disable button
Wait 2 seconds
Enable button
Click
...
请尝试以下代码:
private void button1_MouseClick(object sender, MouseEventArgs e)
{
//disable button on main thread
button1.Enabled = false;
Thread worker = new Thread(() =>
{
//do time consuming job
System.Threading.Thread.Sleep(2000);
//enable button (from the main thread)
this.Invoke((MethodInvoker)delegate
{
textBox1.AppendText("Click " + e.Clicks + "\n");
button1.Enabled = true;
});
});
worker.Name = "Button 1 worker";
worker.Start();
}
现在,耗时的工作在单独的线程上完成,UI事件将按预期工作:
Click
Disable button
Do job on another thread ------------> Wait 2 seconds
Click - ignored (button is disabled) |
Click - ignored (button is disabled) |
Click - ignored (button is disabled) |
Click - ignored (button is disabled) |
Enable button
Click
Disable button ...
答案 1 :(得分:0)
不是在事件中编写逻辑,而是尝试创建一个扩展System.Windows.Forms.Button的自定义控件。
但据我所知,你的代码会让你点击事件处理程序总是与函数链接,如果mc值以0开头。
希望有所帮助
答案 2 :(得分:0)
当您禁用按钮时,可能无法再接收任何鼠标事件,因此您无需更改任何事件处理程序。编写应在处理程序中执行一次的代码并禁用该按钮。因此,只要按钮被禁用,代码就不能再执行了。