我有5种形式如下:
- 表格1
- 表格2
- 表格3
- 表格4
- 表格5
Form1是我的启动表单。我在这个表单中有4个按钮来显示其他表单(form2,form3,form4,form5)。我想在form1后面显示其他表单,然后当我最小化form1时,其他表单也最小化,当我恢复 form1 其他表单也恢复了。但是 form1 总是在其他表单的顶部。
我该如何实施?
以你的最佳形式试试这个。
private List<Form> subForms;
private bool minimized = false;
public TopForm()
{
InitializeComponent();
subForms = new List<Form>();
subForms.Add(new SubForm(1));
subForms.Add(new SubForm(2));
subForms.Add(new SubForm(3));
subForms.Add(new SubForm(4));
subForms.Add(new SubForm(5));
foreach (Form f in subForms)
{
f.Show();
}
BringToFront();
Resize += OnResize;
}
/// <summary>
/// Detects a resize event and handles it according to window state.
/// </summary>
/// <param name="sender">Top form</param>
/// <param name="args">Unused</param>
private void OnResize(object sender, EventArgs args)
{
switch (WindowState)
{
case FormWindowState.Normal:
if (minimized)
{
minimized = false;
OnRestore();
}
break;
case FormWindowState.Minimized:
minimized = true;
OnMinimize();
break;
}
}
/// <summary>
/// Minimize all sub forms
/// </summary>
public void OnMinimize()
{
foreach (Form form in subForms)
{
form.WindowState = FormWindowState.Minimized;
}
}
/// <summary>
/// Restore all forms and bring them to the front, with this main form on top.
/// </summary>
public void OnRestore()
{
foreach (Form form in subForms)
{
form.WindowState = FormWindowState.Normal;
form.BringToFront();
}
BringToFront();
}
使用组合继承将 Z 顺序表单的任务委托给 Form1 类,或者为可以访问所有这些表单的变量的那些表单创建一个中间类。然后:
设置最顶层:
<Form>.TopMost = True;
请参阅:http: //msdn.microsoft.com/en-us/library/system.windows.forms.form.topmost (v=vs.71).aspx
要以特定顺序恢复和最小化表单(这将在您的控制类中)以相反的顺序恢复它们,这意味着您先显示表单 4,然后显示表单 3,然后显示表单 2,然后显示表单 1,然后设置表单 1 的最顶层属性。
然后,在每个表单中使用最小化的处理程序并将其与您的控制器代码集成,这样当 Form1 被最小化时,其他所有内容都会最小化(反之亦然)
祝你好运!
子窗体出现在主窗体后面真的有意义吗?如果父窗体完全最大化怎么办?
否则,每个表单的按钮单击将如下所示:
private void subFormBtn_Click(object sender, EventArgs e)
{
SubForm subForm = new SubForm();
subForm.Show(this);
}
这会将子表单的父级设置为包含单击按钮的表单。
如果您确实需要子表单出现在主表单后面,则需要执行 Benjamin Danger Johnson 建议的操作。