同时移动两个窗体



上下文:我有一个表单,其中包含一个打开新表单的按钮。我想在移动第一个的同时将两个形式一起移动(所以第二个将粘在第一个上(。第一个窗体既不是父窗体,也不是子窗体。第二种形式。


我尝试过什么:在不改变两个窗体的位置(后面或前面(的情况下将两个窗体一起移动,以及如何在C#中将两个窗体连接在一起?这两种解决方案对我都不起作用。


我会一直在身边寻找,但如果有任何帮助,我们将不胜感激,谢谢。

假设您有MainForm,并且在移动它时希望移动所有打开的ChildForm,则可以使用LocationChanged事件处理程序:

// previous MainForm location
private Point m_PreviousLocation = new Point(int.MinValue, int.MinValue);
private void MainForm_LocationChanged(object sender, EventArgs e) {
// All open child forms to be moved
Form[] formsToAdjust = Application
.OpenForms
.OfType<ChildForm>()
.ToArray();
// If the main form has been moved...
if (m_PreviousLocation.X != int.MinValue)
foreach (var form in formsToAdjust) //... we move all child froms aw well
form.Location = new Point(
form.Location.X + Location.X - m_PreviousLocation.X,
form.Location.Y + Location.Y - m_PreviousLocation.Y
);
m_PreviousLocation = Location;
}

所以每当MainForm移动(改变其Location(时,我们也移动所有ChildForm

要在第一个窗体移动时使第二个窗体移动,您可以保存第一个窗体的最后位置,以及每当Form.Move事件触发时,计算差值并相应地更改子窗体:

public partial class ParentForm : Form
{
private ChildForm _childForm;
private Point? _lastLocation;
...
private void ParentForm_Move(object sender, EventArgs e)
{
if (_lastLocation != null
&& _childForm != null
&& Application.OpenForms.Cast<Form>().Contains(_childForm))
{
_childForm.Location = new Point(
_childForm.Location.X + Location.X - _lastLocation.Value.X,
_childForm.Location.Y + Location.Y - _lastLocation.Value.Y);
}
_lastLocation = Location;
}
...
}

要使第二个表单始终位于第一个表单之上,同时仍然可以单击和移动第一个表单,您可以将第一个表单设置为第二个窗体的所有者:

ChildForm = new ChildForm();
ChildForm.Owner = this;
ChildForm.Show();

或者:

ChildForm = new ChildForm();
ChildForm.Show(this);

最新更新