为什么不在运行时给控件的位置属性赋一个新值来改变它的位置呢?
本文关键字:位置 新值 一个 改变 运行时 控件 属性 为什么不 | 更新日期: 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.Location
为0,0
。按钮的位置然后被设置为0,0
,但由于它的位置是相对于它所在的窗体,您的按钮跳转到窗体的左上角。
在第二个示例中,您通过分别将e.X
和e.Y
添加到按钮的现有Left
和Top
属性中来正确地设置位置。
要"修复"第一个示例,您必须修改它以考虑按钮的当前位置:
if (e.Button == MouseButtons.Left)
{
var b = ((Button) sender);
b.Location = new Point(b.Left + e.X, b.Top + e.Y);
}