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
行为的描述。