这个问题与我的另一个问题有关,可以在can be found here找到。我想在其父容器中移动一个PictureBox
TabPage
(如果确实有任何区别!)使用下面的代码可以完成移动:
private Point start = Point.Empty;
private bool _mapPackageIsMoving;
void pictureBoxPackageView_MouseUp(object sender, MouseEventArgs e) {
_mapPackageIsMoving = false;
}
void pictureBoxPackageView_MouseMove(object sender, MouseEventArgs e) {
if (_mapPackageIsMoving) {
pictureBoxPackageView.Location = new Point(
pictureBoxPackageView.Left + (e.X - start.X),
pictureBoxPackageView.Top + (e.Y - start.Y));
}
}
void pictureBoxPackageView_MouseDown(object sender, MouseEventArgs e) {
start = e.Location;
_mapPackageIsMoving = true;
}
现在我的问题是,这种控制的移动没有限制。用户可以将控件拖动距离我的图片框所在的TabPage
的可见区域。我尝试通过更改此类MouseMove
事件来添加一些移动限制,以防止它离开标签页的Left
和Right
可见区域:
void pictureBoxPackageView_MouseMove(object sender, MouseEventArgs e) {
if (_mapPackageIsMoving) {
//Added condition
if (pictureBoxPackageView.Left >= 0 && pictureBoxPackageView.Right >= 0)
pictureBoxPackageView.Location = new Point(
pictureBoxPackageView.Left + (e.X - start.X),
pictureBoxPackageView.Top + (e.Y - start.Y));
}
}
但上面代码的问题是当图片框点击容器的右侧或左侧并且Left
或Right
等于0时,我无法移动控件。< / p>
任何帮助/提示,以限制图片框Left, Right, Top and Bottom
的容器内的这种移动将受到关注!
答案 0 :(得分:3)
你可以无条件地移动盒子(不测试当前位置)并对你的新位置有限制:
int nx = Math.Min(Math.Max(pictureBoxPackageView.Left + (e.X -start.X),0),pictureBoxPackageView.Parent.Width-pictureBoxPackageView.Width);
int ny = Math.Min(Math.Max(pictureBoxPackageView.Top + (e.Y -start.Y),0),pictureBoxPackageView.Parent.Height-pictureBoxPackageView.Height);
pictureBoxPackageView.Location = new Point(nx,ny);
答案 1 :(得分:-1)
我认为如果您添加以下代码,它会将项目移动到顶部作为选项。
//- MouseDownLocation.X
//- MouseDownLocation.Y
int nx = Math.Min(Math.Max(label1.Left - MouseDownLocation.X + (e.X - start.X), 0), label1.Parent.Width - label1.Width);
int ny = Math.Min(Math.Max(label1.Top - MouseDownLocation.Y + (e.Y - start.Y), 0), label1.Parent.Height - label1.Height);