当我使用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 Height
的MDICHildren
。当然,您可以实现一些其他逻辑,这些逻辑仅在打开了至少3个MDIChildren
时才应用乘法器。
调整所有MDIChildren
的大小以匹配MDIParent.Width
和计算出的Height
,然后按名称排序并从上到下放置。
设置不同的HorizontalTileHeightMultiplier
值以查看MDIChildren
在MDIParent.ClientArea
(MdiClient
)中的位置。
此乘数也可以用作应用程序中的自定义属性,可供其用户使用,以允许自定义平铺表格。
布局代码是作为私有方法提供的,因此可以在不同的事件处理程序中轻松地使用它来执行/维护选定的布局(例如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/