计时器、点击、鼠标按下和鼠标抬起事件不能同时工作

3

我有一个问题需要帮助解决,希望您能提供帮助。

如果此问题已经被问过了,请谅解,我找不到类似的答案。

我的想法是当单击picturebox时将图像更改为ON。

如果按住picturebox超过2秒钟,则打开一个新窗体并将picturebox保持为OFF。

但是,如果单击picturebox ON,然后按住2秒钟,然后返回,则需要保持picturebox状态为ON。

这是我迄今为止尝试过的。

我相信为了使其正常工作,我需要停止MouseUp事件的发生。

是否有一种方法可以在Tick发生时停止MouseUp?

是否有更简单/更好的方法来做到这一点?

任何帮助都将不胜感激。

    private void time_HoldDownInternal_Tick(object sender, EventArgs e)
    { 
        time_HoldDownInternal.Enabled = false;
        time_HoldDownInternal.Interval = 1000;
        form1show.Visible = true;
    }

    private void pb_pictureBoxTest_MouseDown(object sender, MouseEventArgs e)
    {
        mainMenuVariables.mousedown = true;
        time_HoldDownInternal.Enabled = true;
    }

    private void pb_pictureBoxTest_MouseUp(object sender, MouseEventArgs e)
    {
        mainMenuVariables.mousedown = false;
        //MessageBox.Show("mouse up");
        time_HoldDownInternal.Enabled = false;
        time_HoldDownInternal.Interval = 1000;
    }

    private void pb_pictureBoxTest_Click(object sender, EventArgs e)
    {
        if (mainMenuVariables.mousedown == true)
        {
            if (mainMenuVariables.pictureBox == false)
            {
                mainMenuVariables.pictureBox = true;
                pb_pictureBoxTest.Image = new Bitmap(mainMenuVariables.pictureBoxOn);
                return;
            }
            if (mainMenuVariables.pictureBox == true)
            {
                mainMenuVariables.pictureBox = false;
                pb_pictureBoxTest.Image = new Bitmap(mainMenuVariables.pictureBoxOff);
                return;
            }
        }
        if (mainMenuVariables.mousedown == false)
        {
            //nothing
        }
    }
1个回答

5

不要开始计时器,只需在鼠标按下时记录当前时间。然后在鼠标抬起时检查是否已经过了2秒钟。例如:

private void pb_pictureBoxTest_MouseDown(object sender, MouseEventArgs e)
{
    mainMenuVariables.mousedown = true;
    mainMenuVariables.mousedowntime = DateTime.Now;
}

private void pb_pictureBoxTest_MouseUp(object sender, MouseEventArgs e)
{
    mainMenuVariables.mousedown = false;
    var clickDuration = DateTime.Now - mainMenuVariables.mousedowntime;

    if ( clickDuration > TimeSpan.FromSeconds(2))
    {
        // Do 'hold' logic (e.g. open dialog, etc)
    }
    else
    {
        // Do normal click logic (e.g. toggle 'On'/'Off' image)
    }
}

我现在会考虑这个问题,但如果已经打开或关闭,改变图像的开/关状态怎么办? - justin89
@justin89 请看我上面的编辑 - 基于你的代码添加了一个代码示例。 - Tyson
这很好,唯一想改变的是现在表单会在你松开后打开。我希望让表单在按钮按住2秒后立即出现。我正在考虑将您的代码添加到mousedown中,但似乎不起作用。再次感谢您的帮助。[代码] var clickDuration = DateTime.Now - mainMenuVariables.mousedowntime;if ( clickDuration > TimeSpan.FromSeconds(2)) { // 进行“保持”逻辑(例如打开对话框等) } else - justin89
@justin89 嗯,说得好。如果你想让它在2秒后打开对话框,无论用户是否释放了鼠标按钮,你将不得不使用一个计时器。这是可能的,只是有点更复杂。我会使用与上面相同的方法,结合一个计时器。计时器的tick事件然后启动对话框。在鼠标抬起事件中,只需检查 if (clickDuration < TimeSpan(2)) 并进行正常的“On”/“Off”图像交换即可。 - Tyson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接