Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何控制MDI表单中子表单的显示顺序_C#_Winforms_Display_Mdi - Fatal编程技术网

C# 如何控制MDI表单中子表单的显示顺序

C# 如何控制MDI表单中子表单的显示顺序,c#,winforms,display,mdi,C#,Winforms,Display,Mdi,当我使用MDI表单时,我遇到了一个问题。我的源代码如下: private void menuItem1_Click(object sender, EventArgs e) { Form[] charr = this.MdiChildren; int i = 0; foreach (Form chform in charr) { chform.Dock = DockStyle.T

当我使用
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(mdilaway.TileHorizontal)
后,单击第一个子窗体的标题栏,该子窗体将自动显示在
MDI
父窗体的底部。

我希望单击的子窗体保持其原始位置。

对此问题有什么想法吗?

查看链接问题-建议设置
Dock
属性以调整
MDIChild
表单位置-以及当前报告的行为,最好在不借助自动功能的情况下定义
MDIChild
表单的布局。

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

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

此乘数允许非常精确地定义
MDI子项的
水平平铺高度
。当然,您可以实现一些其他逻辑,仅当至少有3个打开的
MDIChildren

所有的
MDI子项
都会重新调整大小,以匹配
MDIParent.Width
和计算的
高度
,然后按名称排序并从上到下定位。

设置不同的
HorizontalHightMultiplier
值,以查看
MDIChildren
如何定位在
MDIParent.ClientArea
MdiClient
)中。
此乘数还可以用作应用程序中的自定义属性,可供其用户使用,以允许表单的自定义平铺。

布局代码是作为私有方法提供的,因此可以在不同的事件处理程序中轻松使用它来执行/维护所选布局(例如,
mdipradent.Resize

如果需要,此方法也可以轻松地进行调整,以替换
mdiloayout.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;
    }
}
private float horizontalHeightMultiplier=2;
private void menuItem1\u单击(对象发送者,事件参数e)
{
TileHorizontal()
}
私有空心砖水平()
{
int OpenedForms=Application.OpenForms.Count-1;
if(OpenedForms<2)返回;
int=0;
int ChildrenHeight=
(int)((this.ClientSize.Height/OpenedForms)*水平高度乘法器);
List children=this.MdiChildren.OrderBy(f=>f.Name.ToList();
foreach(在children中形成child)
{
child.Size=新大小(this.ClientSize.Width-SystemInformation.VerticalScrollBarWidth-4,ChildrenHeight);
子位置=新点(0,位置);
身高+=儿童身高;
}
}

只调用
this.LayoutMdi(mdilaway.TileHorizontal)
而不停靠MDI子级?@Jimi如果只调用this.LayoutMdi(mdilaway.TileHorizontal),则无法正常工作。谢谢你的回答。我会试试的,我已经试过了,很有效!正如您所说的,自动功能是导致此问题的原因(但如何,我还不知道)。再次感谢。@ballshark阅读了我在停靠/锚定时写的关于对象布局规则的描述,特别是关于
BringToFront
/
SendToBack
行为的描述。