WinForms中的Z-Order表单

时间:2012-09-26 22:26:10

标签: c# winforms

我有以下5种形式:

  • Form1中
  • 窗体2
  • Form3
  • Form4
  • Form5

Form1是我的启动表单。我在此表单中有4个按钮来显示其他表单(form2,form3,form4,form5)。我想显示form1后面的其他表单,然后当我最小化form1时,其他表单也被最小化当我恢复form1时,其他形式也会恢复。但是form1总是最重要的其他形式。

我该如何实现?

3 个答案:

答案 0 :(得分:2)

以最佳形式试试。

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();
}

答案 1 :(得分:0)

使用组合继承将Z-order表单的任务委托给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最小化时,其他所有内容都最小化(反之亦然)

祝你好运!

答案 2 :(得分:0)

儿童表格出现在主表单后面真的有意义吗?如果父表单完全最大化怎么办?

否则每个表单的按钮点击将如下所示:

private void subFormBtn_Click(object sender, EventArgs e)
        {
            SubForm subForm = new SubForm();
            subForm.Show(this);

        }

这会将子表单的父级设置为包含按钮单击的表单。

如果你真的需要在主表格后面出现子表格,你需要做一些像Benjamin Danger Johnson建议的那样。