[英]How can I control the display order of child Forms in a MDI Form
當我使用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)
,點擊第一個子 Form 的標題欄,這個子 Form 會自動顯示在MDI
父級的底部。
我希望單擊的子窗體保持其原始位置。
這個問題有什么想法嗎?
查看鏈接的問題 - 建議設置Dock
屬性以調整MDIChild
表單位置 - 以及當前報告的行為,最好在沒有自動功能幫助的情況下定義MDIChild
表單的布局。
這允許執行任何看起來合適的布局邏輯。
在該示例中, MDIChildren.Height
計算相對於MDIParent.ClientSize.Height
和打開的數量MDIChildren
由2中的樣本代碼,基本測量兩次:,然后由值相乘。
這個乘數允許非常精確地定義MDICHildren
的Horizontal Tile Height
。 當然,您可以實現一些其他邏輯,僅當至少有 3 個打開的MDIChildren
時才應用乘數。
所有MDIChildren
都重新調整大小以匹配MDIParent.Width
和計算出的Height
,然后按 Name 排序並從上到下定位。
設置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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.