为什么不在运行时给控件的位置属性赋一个新值来改变它的位置呢?

本文关键字:位置 新值 一个 改变 运行时 控件 属性 为什么不 | 更新日期: 2023-09-27 18:11:12

每当我需要在运行时移动控件在窗体上的位置时,我必须为其Top和Left属性分配新值。为什么Location属性不能做到这一点?

例如,我应该能够做:

private void btn_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ((Button)sender).Location = e.Location;
            }
          
        }

但是这不起作用,我必须这样做:

private void btn_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ((Button)sender).Left = e.X + ((Button)sender).Left;
                ((Button)sender).Top = e.Y + ((Button)sender).Top;
            }
        }

为什么不在运行时给控件的位置属性赋一个新值来改变它的位置呢?

这两个代码片段不相等。

MouseEventArgs报告坐标相对于您将MouseMove事件附加到的控件,在本例中为Button。

在第一个示例中,当鼠标位于按钮的左上角时,e.Location0,0。按钮的位置然后被设置为0,0,但由于它的位置是相对于它所在的窗体,您的按钮跳转到窗体的左上角。

在第二个示例中,您通过分别将e.Xe.Y添加到按钮的现有LeftTop属性中来正确地设置位置。


要"修复"第一个示例,您必须修改它以考虑按钮的当前位置:

if (e.Button == MouseButtons.Left)
{
    var b = ((Button) sender);
    b.Location = new Point(b.Left + e.X, b.Top + e.Y);
}