在鼠标悬停时重新定位图像

时间:2014-02-05 12:41:54

标签: c# winforms

我正在尝试在visual studio 2012上重新创建一个mac风格的菜单栏。我可以让图像在mouseEnter上移动并重新定位到mouseLeave上的原始位置。我这样做是通过设置图片框的位置。

我遇到的问题是当我鼠标输入图像时如果我将鼠标放在旧图像位置底部和新图像位置底部之间图像底部的区域中,图像将在图像之间不断跳跃两个位置。

任何人都可以建议如何制止或避免它。

private void pic1_MouseEnter(object sender, EventArgs e)
{
    pic1.Location = new Point(328, 300);
}

private void pic1_MouseLeave(object sender, EventArgs e)
{
    pic1.Location = new Point(328, 316);
}

3 个答案:

答案 0 :(得分:2)

尝试在移动图像位置之前分离事件处理程序,然后将其附加回来。像这样:

private void pic1_MouseEnter(object sender, EventArgs e)
{
    pic1.MouseEnter -= pic1_MouseEnter;
    pic1.MouseLeave -= pic1_MouseLeave;

    pic1.Location = new Point(328, 300);

    pic1.MouseEnter += pic1_MouseEnter;
    pic1.MouseLeave += pic1_MouseLeave;
}

答案 1 :(得分:1)

是的,因为移动图像会触发MouseLeave事件,Leave回调会将其发送到原始位置,从而永远触发MouseEnter等等(除非您将鼠标移开)。

我建议您删除MouseLeave回调并保持图像所在的状态:

private bool retracted = false;
private void pic1_MouseEnter(object sender, EventArgs e)
{
    if (retracted)
    {
        pic1.Location = new Point(328, 316);
    }
    else
    {
        pic1.Location = new Point(328, 300);
    }
    retracted = !retracted;
}

答案 2 :(得分:1)

感谢所有解决方案,但没有一个能达到预期的效果,但我已经提出了使用mouseHover和mouseLeave的解决方案。悬停时将图像移动到所需位置,然后将其返回原始位置。

    private void pic1_MouseLeave(object sender, EventArgs e)
    {
        pic1.Location = new Point(328, 316);
    }

    private void pic1_MouseHover(object sender, EventArgs e)
    {
        pic1.Location = new Point(328, 310);
    }