使用MouseHover使PictureBox可见/不可见

4

我认为这是一个愚蠢的问题,但我不明白这里发生了什么。

我使用以下代码:

   private void pictureBox1_MouseHover(object sender, EventArgs e)
    {
        pictureBox1.Visible = false;
        pictureBox1.BackColor = Color.Black;
    }

    private void pictureBox1_MouseLeave(object sender, EventArgs e)
    {
        pictureBox1.Visible = true;
    }

问题是:鼠标悬停在picturebox上,picturebox会变成黑色,但可见性并没有改变。为什么?

2
我猜当你将picturebox的可见性设置为关闭时,MouseLeave事件会被调用。 - Graffito
我需要点击并按下鼠标才能让图片框消失。但是如果我不再按鼠标,图片框会重新出现。但是我不明白为什么……为什么在使用MouseHover事件时我需要按下鼠标? - RedoColor
1
正如Graffito所说:一旦PB不再__可见__,鼠标就不再悬停在其上。因此,MouseLeave会立即触发。如果使用MouseEnter,您将会看到闪烁,但是除非移动鼠标,否则不会调用MouseHover。顺便说一句:我既想不出简单的解决方案,也想不出为什么首先要编写这样的代码。 - TaW
1
@TaW,简单的解决方案是在下面使用相同形状的控件来捕获其“MouseLeave”事件,以使picturebox再次可见。这很明显,我懒得发表答案了。 - Sinatr
是的,或者做一些计时器技巧等。但是任何涉及另一个对象的事情在我看来都不是很简单.. ;-) - TaW
2个回答

1
我认为你的问题是,当你将鼠标悬停在图片上时,它立即消失了(这就是为什么你看到背景颜色变成黑色,事件正在触发)。然而,图片消失了,导致你的鼠标不再在图片上,因此触发了Mouse_Leave事件。

1
你可以使用 MouseEnter 事件替代 MouseHover,并使用布尔字段 isHover 尝试减少闪烁:
public partial class Form1: Form
{
    bool isHover = false;

    private void pictureBox1_MouseEnter(object sender, EventArgs e)
    {
        if(isHover) return;
        // with MouseHover this control visibility appears to be locked with MouseEnter it is not
        pictureBox2.Visible = false;
        pictureBox2.BackColor = Color.Black;
    }

    private void pictureBox1_MouseLeave(object sender, EventArgs e)
    {            
        if(!isHover) return;
        isHover = false;
        pictureBox2.Visible = true;
    }

...

}

这既不是问题也不是解决方案。你应该测试你发布的代码..! - TaW
1
@TaW 刚刚测试了一下,它可以正常工作。控件消失了,悬停时也没有出现。 - Fabjan
它并不真正起作用,只是让你觉得它起作用了。为了证明这一点,在MouseEnter中添加Text +=“+”;,在MouseLeave中添加Text +=“-”;,你会看到它会闪烁很多次,窗口标题栏会在鼠标移动时出现很多“+-+-+-…”,但你看不到它,因为它比重新绘制发生的更快(原因我不知道)。 - Sinatr

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