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()父对象的代码>。如果你有,那就不会了。这是您必须使用的前三行。