更改父级时,恢复PictureBox的先前绝对位置?

在我的GUI中,我需要将PictureBoxes更改为背景PictureBox以便透明度正常工作。

但是,更改父级也会更改图片框的位置。 我试过通过PointToClient抓取图片框的绝对位置,但它不起作用。 我将坐标放在注释中,并且在分配新父项后它们不会更改,即使图像明显改变了位置。 此外,我不认为它可能会工作,因为它是通过一个点,而不是一个有关父母的更多信息的对象,以及推断绝对位置所需的东西。

推断元素绝对位置的正确方法是什么,以便我可以在父元素更改后将图像移动到正确的位置? 或者有更好的方法吗?

 Point oldRel = pictureBox4.Location; //258, 109 Point oldAbs = PointToClient(oldRel); //75, -96 //Commenting out this line fixes the image shift but ruins the transparency pictureBox4.Parent = pictureBox2; Point newRel = pictureBox4.Location; //258, 109 Point newAbs = PointToClient(pictureBox4.Location); //75, -96 

这会将Control child从一个Parent移动到一个Parent,保持绝对屏幕位置不变:

 void MoveTo(Control child, Control newParent ) { child.Location = newParent.PointToClient(child.PointToScreen(Point.Empty)); child.Parent = newParent; } 

PointToClientPointToScreen的技巧是从右侧父控件中使用它们; 不设置控件将默认为Form ,这将错过父级的实际位置..