当我使用MDI表单时,我遇到了问题。我的源代码是这样的:

private void menuItem1_Click(object sender, EventArgs e)
    {
        Form[] charr = this.MdiChildren;
        int i = 0;
        foreach (Form chform in charr)
        {
            chform.Dock = DockStyle.Top;
        }
        this.LayoutMdi(System.Windows.Forms.MdiLayout.TileHorizontal);
    }


子窗体的数量多于3。为了在调用LayoutMdi()方法后正确显示它们,我必须将所有子窗体的Dock属性设置为DockStyle.Top

调用LayoutMdi(MdiLayout.TileHorizontal)后,单击第一个子窗体的标题栏,该子窗体将自动显示在MDI父窗体的底部。

我希望单击的子窗体保持其原始位置。
这个问题有什么主意吗?

最佳答案

查看链接的问题-建议在何处设置Dock属性以调整MDIChild表单的位置-以及当前报告的行为,可能更可取的是在没有自动帮助的情况下定义MDIChild表单的布局特征。

这允许执行似乎合适的任何布局逻辑。

在此示例中,相对于MDIChildren.Height和打开的MDIParent.ClientSize.Height的数量计算MDIChildren,然后乘以一个值:在示例代码中乘以2,是基本度量的两倍。

此乘数允许非常精确地定义Horizontal Tile HeightMDICHildren。当然,您可以实现一些其他逻辑,这些逻辑仅在打开了至少3个MDIChildren时才应用乘法器。

调整所有MDIChildren的大小以匹配MDIParent.Width和计算出的Height,然后按名称排序并从上到下放置。

设置不同的HorizontalTileHeightMultiplier值以查看MDIChildrenMDIParent.ClientAreaMdiClient)中的位置。
此乘数也可以用作应用程序中的自定义属性,可供其用户使用,以允许自定义平铺表格。

布局代码是作为私有方法提供的,因此可以在不同的事件处理程序中轻松地使用它来执行/维护选定的布局(例如MDIParent.Resize)。
如果需要,此方法也可以轻松地用于替换MdiLayout.TileVertical

private float HorizontalTileHeightMultiplier = 2;

private void menuItem1_Click(object sender, EventArgs e)
{
    TileHorizontal()
}

private void TileHorizontal()
{
    int OpenedForms = Application.OpenForms.Count - 1;
    if (OpenedForms < 2) return;

    int StartLocation = 0;
    int ChildrenHeight =
        (int)((this.ClientSize.Height / OpenedForms) * HorizontalTileHeightMultiplier);

    List<Form> children = this.MdiChildren.OrderBy(f => f.Name).ToList();
    foreach (Form child in children)
    {
        child.Size = new Size(this.ClientSize.Width - SystemInformation.VerticalScrollBarWidth - 4, ChildrenHeight);
        child.Location = new Point(0, StartLocation);
        StartLocation += ChildrenHeight;
    }
}

关于c# - 如何控制MDI表单中子表单的显示顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53217815/

10-17 01:18