C# WinForms中窗体的Z顺序

C# WinForms中窗体的Z顺序,c#,winforms,C#,Winforms,我有以下5种表格: 表格1 表格2 表格3 表格4 表格5 Form1是我的启动表单。我在这个表单中有4个按钮来显示其他表单(form2、form3、form4、form5)。我想在Form1后面显示其他表单,然后当我最小化Form1时,其他表单也会最小化,当我还原Form1时,其他表单也会还原。但是Form1总是位于其他表单的顶部 如何实现这一点?使用组合继承将Z顺序表单的任务委托给Form1类,或者为那些可以访问所有这些表单变量的表单创建一个中间类。然后: 要设置最顶层,请执行以下操作:

我有以下5种表格:

  • 表格1
  • 表格2
  • 表格3
  • 表格4
  • 表格5
Form1是我的启动表单。我在这个表单中有4个按钮来显示其他表单(form2、form3、form4、form5)。我想在Form1后面显示其他表单,然后当我最小化Form1时,其他表单也会最小化,当我还原Form1时,其他表单也会还原。但是Form1总是位于其他表单的顶部


如何实现这一点?

使用组合继承将Z顺序表单的任务委托给Form1类,或者为那些可以访问所有这些表单变量的表单创建一个中间类。然后:

要设置最顶层,请执行以下操作:

<Form>.TopMost = True;
.TopMost=True;
见:

要让表单按特定顺序还原和最小化(这将在您的控制类中),请按相反顺序还原它们,这意味着您将显示表单4、表单3、表单2、表单1,然后设置表单1的最顶层属性

然后,在每个表单中使用最小化处理程序,并将其与控制器代码集成,以便在任何时候最小化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();
}
私有列表子窗体;
私有布尔最小化=假;
公共TopForm()
{
初始化组件();
子窗体=新列表();
添加(新的子表单(1));
添加(新的子表单(2));
添加(新的子表单(3));
添加(新的子表单(4));
添加(新的子表单(5));
foreach(子表单中的表单f)
{
f、 Show();
}
布林托夫隆();
Resize+=OnResize;
}
/// 
///检测调整大小事件并根据窗口状态进行处理。
/// 
///最高形式
///未使用
私有void OnResize(对象发送方、事件args args)
{
开关(WindowsState)
{
案例FormWindowsState。正常:
如果(最小化)
{
最小化=错误;
OnRestore();
}
打破
案例FormWindowsState。最小化:
最小化=真;
OnMinimize();
打破
}
}
/// 
///最小化所有子窗体
/// 
最小化()上的公共无效
{
foreach(子窗体中的窗体)
{
form.WindowState=FormWindowState.Minimized;
}
}
/// 
///恢复所有表单并将它们放在前面,将此主表单放在顶部。
/// 
公共void OnRestore()
{
foreach(子窗体中的窗体)
{
form.WindowState=FormWindowState.Normal;
形式.BringToFront();
}
布林托夫隆();
}

子窗体出现在主窗体后面真的有意义吗?如果父窗体被完全最大化怎么办

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

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

        }
这将子窗体的父窗体设置为包含单击按钮的窗体


如果您确实需要子窗体显示在主窗体后面,则需要执行Benjamin Danger Johnson建议的操作。

我不喜欢topmost,因为当我将topmust设置为true时,我的窗体将置于所有其他程序之上:(如果需要同时关闭所有窗体,则可以在OnClosed事件中执行类似操作。请记住,这将还原所有子窗口。如果要使手动最小化的子窗口最小化,则应添加公共属性(public bool minimized{get;set;})到子窗口。这样,您可以在OnRestore中还原WindowsState之前进行检查。此解决方案的唯一问题是,如果您将主窗体设置为其所有者,则子窗体将强制自己位于主窗体的顶部。如果您想打开消息窗口、设置窗口或关于框,则此类解决方案非常有用。