C# 在鼠标上方重新定位图像

C# 在鼠标上方重新定位图像,c#,winforms,C#,Winforms,我试图在VisualStudio2012上重新创建一个mac风格的菜单栏。我可以让图像在mouseEnter上移动并重新定位到mouseLeave上的原始位置。我通过设置picturebox的位置来实现这一点 我的问题是,当我用鼠标输入图像时,如果我将鼠标放在旧图像位置底部和新图像位置底部之间的图像底部区域,图像将在这两个位置之间不断跳跃 有人能建议如何阻止或避免这种情况吗 private void pic1_MouseEnter(object sender, EventArgs e) {

我试图在VisualStudio2012上重新创建一个mac风格的菜单栏。我可以让图像在mouseEnter上移动并重新定位到mouseLeave上的原始位置。我通过设置picturebox的位置来实现这一点

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

有人能建议如何阻止或避免这种情况吗

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);
}

尝试在移动图像位置之前分离事件处理程序,然后在移动图像位置之后将其重新连接。大概是这样的:

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;
}

尝试在移动图像位置之前分离事件处理程序,然后在移动图像位置之后将其重新连接。大概是这样的:

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;
}

是的,因为移动图像会触发
MouseLeave
事件,所以Leave callback会将其发送到其原始位置,从而永远触发
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;
}

是的,因为移动图像会触发
MouseLeave
事件,所以Leave callback会将其发送到其原始位置,从而永远触发
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;
}

感谢所有的解决方案,但都没有达到预期的效果,但我用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);
    }

感谢所有的解决方案,但都没有达到预期的效果,但我用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);
    }

我尝试在Winsforms中做到这一点,一些反馈(评论/投票/标记正确答案)总是值得赞赏的。我尝试在Winsforms中做到这一点,一些反馈(评论/投票/标记正确答案)总是值得赞赏的。干杯,但跳跃效果仍然存在。干杯,但跳跃效果仍然存在。