C# 同时移动两个窗体

C# 同时移动两个窗体,c#,winforms,C#,Winforms,上下文:我有一个表单,其中包含打开新表单的按钮。我想在移动第一个表单时同时移动这两个表单(因此第二个表单将粘在第一个表单上)。第一个表单既不是父表单,也不是子表单。第二种形式也是 我试过什么:和 这两种解决方案对我都不起作用 我会一直在我身边搜寻,但任何帮助都将不胜感激,谢谢 假设您有MainForm并且在移动它时希望移动所有打开的ChildForms,您可以使用LocationChanged事件处理程序: // previous MainForm location private Poin

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


我试过什么:和 这两种解决方案对我都不起作用



我会一直在我身边搜寻,但任何帮助都将不胜感激,谢谢

假设您有
MainForm
并且在移动它时希望移动所有打开的
ChildForm
s,您可以使用
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;
}
//上一个主窗体位置
私有点m_PreviousLocation=新点(int.MinValue,int.MinValue);
私有void主窗体位置已更改(对象发送方,事件参数e){
//要移动的所有打开的子窗体
Form[]formsToAdjust=应用程序
.OpenForms
第()类
.ToArray();
//如果主窗体已移动。。。
if(m_PreviousLocation.X!=int.MinValue)
foreach(formsToAdjust中的var form)/…我们将所有子对象从aw中移出
form.Location=新点(
form.Location.X+Location.X-m_PreviousLocation.X,
form.Location.Y+Location.Y-m_PreviousLocation.Y
);
m_PreviousLocation=位置;
}

因此,每当
MainForm
移动(更改其
位置
)时,我们也会移动所有
ChildForm

假设您有
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;
}
//上一个主窗体位置
私有点m_PreviousLocation=新点(int.MinValue,int.MinValue);
私有void主窗体位置已更改(对象发送方,事件参数e){
//要移动的所有打开的子窗体
Form[]formsToAdjust=应用程序
.OpenForms
第()类
.ToArray();
//如果主窗体已移动。。。
if(m_PreviousLocation.X!=int.MinValue)
foreach(formsToAdjust中的var form)/…我们将所有子对象从aw中移出
form.Location=新点(
form.Location.X+Location.X-m_PreviousLocation.X,
form.Location.Y+Location.Y-m_PreviousLocation.Y
);
m_PreviousLocation=位置;
}

因此,每当
MainForm
移动时(更改其
位置),我们也会移动所有
子表单。

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

公共部分类父窗体:窗体
{
私人儿童形式(ChildForm);;
私人点?\最新位置;
...
私有void ParentForm_Move(对象发送方,事件参数e)
{
如果(_lastLocation!=null
&&\u childForm!=null
&&Application.OpenForms.Cast()包含(_childForm))
{
_childForm.Location=新点(
_childForm.Location.X+Location.X-\u lastLocation.Value.X,
_childForm.Location.Y+Location.Y-\u lastLocation.Value.Y);
}
_lastLocation=位置;
}
...
}
要使第二个表单始终位于第一个表单之上,同时仍然能够单击和移动第一个表单,可以将第一个表单设置为第二个表单的所有者:

ChildForm=new ChildForm();
ChildForm.Owner=这个;
ChildForm.Show();
或:

ChildForm=new ChildForm();
ChildForm.Show(这个);

要在第一个表单移动时移动第二个表单,您可以保存第一个表单的最后一个位置,并且每当触发
表单.move
事件时,计算差异并相应地更改子表单:

公共部分类父窗体:窗体
{
私人儿童形式(ChildForm);;
私人点?\最新位置;
...
私有void ParentForm_Move(对象发送方,事件参数e)
{
如果(_lastLocation!=null
&&\u childForm!=null
&&Application.OpenForms.Cast()包含(_childForm))
{
_childForm.Location=新点(
_childForm.Location.X+Location.X-\u lastLocation.Value.X,
_childForm.Location.Y+Location.Y-\u lastLocation.Value.Y);
}
_lastLocation=位置;
}
...
}
要使第二个表单始终位于第一个表单之上,同时仍然能够单击和移动第一个表单,可以将第一个表单设置为第二个表单的所有者:

ChildForm=new ChildForm();
ChildForm.Owner=这个;
ChildForm.Show();
或:

ChildForm=new ChildForm();
ChildForm.Show(这个);

您发布的第一个答案在哪些方面不起作用?第二个说你做不到,但第一个说明了方法。为什么它不适用于您?好吧,我在最后一行得到一个NullReferenceException(该行表示childForm需要成为类成员,实际上我是类成员),如果您这样做了,则不会:
this.childForm=new ChildFormClass()。如果你有,那就不会了。这是你必须使用的前三行。你发布的第一个答案在什么方面不起作用?第二个说你做不到,但第一个说明了方法。为什么它不适用于您?好吧,我在最后一行得到一个NullReferenceException(该行表示childForm需要成为类成员,实际上我是类成员),如果您这样做了,则不会:
this.childForm=new ChildFormClass()。如果你有,那就不会了。这是您必须使用的前三行。