C# 为什么mouseeventarg在等式中使用时不起作用

C# 为什么mouseeventarg在等式中使用时不起作用,c#,winforms,C#,Winforms,Windows窗体应用程序: 这让我困惑了好几个小时。我试图做的是当我按住标签时,它会移动表单 private void label1_MouseUp(object sender, MouseEventArgs e) { KeepMoving = false; } private void label1_MouseDown(object sender, MouseEventArgs e) { KeepMoving = tr

Windows窗体应用程序:

这让我困惑了好几个小时。我试图做的是当我按住标签时,它会移动表单

    private void label1_MouseUp(object sender, MouseEventArgs e)
    {
        KeepMoving = false;
    }

    private void label1_MouseDown(object sender, MouseEventArgs e)
    {
        KeepMoving = true;
    }

    private void label1_MouseMove(object sender, MouseEventArgs e)
    {
        if (KeepMoving == true)
            this.Location = new Point(MousePosition.X - (e.X + SystemInformation.FrameBorderSize.Width + label1.Left), MousePosition.Y - (e.Y + SystemInformation.CaptionHeight + label1.Top));

    }
这就是我正在使用的(当然是公共bool KeepMoving)

如果我移除e.X和e.Y,一切都正常,但是它是相对于标签左上角的位置,但是我想要标签上的位置

当我使用messagebox来显示标签上e.X和e.Y的坐标时,数字是正确的,显示了我在标签上单击的位置。当我使用上面代码中的点时,无论我在标签上单击什么位置,数字都不会改变,当我尝试移动它时,它会上升到30k+范围


为什么MouseEventArgs在我的等式中不起作用?很抱歉,如果我描述得不好,我已经尽力了。

跟踪标签左上角的初始偏移量,并相应地调整表单的位置

    public bool KeepMoving = false;
    private Point offset;

    private void label1_MouseDown(object sender, MouseEventArgs e)
    {
        KeepMoving = true;
        offset = new Point(e.X, e.Y);
    }

    private void label1_MouseUp(object sender, MouseEventArgs e)
    {
        KeepMoving = false;
    }

    private void label1_MouseMove(object sender, MouseEventArgs e)
    {
        if (KeepMoving)
        {
            Left += e.X - offset.X;
            Top += e.Y - offset.Y;
        }
    }

我理解它背后的逻辑,但我可以问一下它与上面的有什么不同吗?当它相应地更改和更新时,为什么不获取当前参数?但是,谢谢,它确实可以按我所希望的方式工作。当标签与鼠标光标的相对位置发生变化时,MouseMove事件将再次引发。这是一个微妙的无限循环。通过使用恒定的相对位置(
offset
,在本例中),当
e
offset
相等时,“循环”将终止(导致
Left+=0;Top+=0
不会引发
MouseMove
事件)。移动标签会更改标签相对于鼠标光标的相对位置。你需要记录你从哪里开始的。