Предотвращение перемещения элемента управления из его контейнера

Этот вопрос связан с другим моим вопросом, который можно найти здесь найдено здесь. Я хотел переместить 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, я больше не могу перемещать элемент управления.

Любая помощь/советы по ограничению этого движения внутри контейнера для Left, Right, Top and Bottom окна изображения будут оценены!


person Saeid Yazdani    schedule 17.08.2012    source источник


Ответы (2)


вы можете безоговорочно перемещать поле (без проверки текущего местоположения) и иметь ограничение для вашего нового местоположения:

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);
person DarkSquirrel42    schedule 17.08.2012
comment
Спасибо! Это работает как шарм. Не могли бы вы рассказать мне еще одну вещь? Как я могу позволить элементу управления перемещаться по Bottom контейнера? Я имею в виду, что ограничение не должно применяться к низу, но все же должно применяться к левому, правому и верхнему. - person Saeid Yazdani; 17.08.2012
comment
Ничего, нашел как var y = Math.Min(Math.Max(finalLocation.Y, 0), pictureBoxPackageView.Bottom); - person Saeid Yazdani; 17.08.2012
comment
здесь опечатка.. pictureBoxPackageView.parent должно быть pictureBoxPackageView.Parent - person aswzen; 07.09.2016

Я думаю, что если вы добавите следующий код, он переместит элемент без привязки к вершине в качестве опции.

//- 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);
person ACopeLan    schedule 03.05.2017
comment
Зачем повторяете ответ на очень старую тему? Здесь для некоторых быстрых точек?! - person Saeid Yazdani; 05.05.2017
comment
Я думаю, что мы слишком чувствительны. Я ничего не знаю об очках и не знал, что быть полезным — это игра. Это какая-то игра, о которой я не знаю? Я просто пытался быть полезным. Но это может объяснить, почему все так стремятся не помогать. Лол, я бы задал вопрос и получил отрицательные баллы. Это игровой сайт?? - person ACopeLan; 08.05.2017