在用c#開發winform時,如果功能愈做愈多,使用者畫面愈開愈多。一定會有桌面都被功能佔滿的抱怨
在這方面我做了很多方向的嘗試
方案1:分類出父子的歸屬,限制子視窗只能開啟一個
=========================================================================
ChildForm c = new ChildForm();
Boolean isopen = false;
foreach (Form OpenForm in System.Windows.Forms.Application.OpenForms)
{
if (OpenForm.GetType().FullName == c.GetType().FullName)
{
isopen = true;
OpenForm.WindowState = FormWindowState.Normal;
OpenForm.TopMost = true;
}
}
if (!isopen)
{
c.Show();
}
這個就是在form show之前先判斷window內已經開啟的視窗名字是否有相同的
但是這個有很大的盲點就是他所判斷的是「所有目前window已開視窗」
但如果有 訂單父視窗→開啟客戶子視窗
報價父視窗→開啟客戶子視窗
這種情況如果訂單父視窗已經開了客戶子視窗
報價父視窗要再開啟的話,結果彈出訂單沒編輯完的客戶子視窗(死)
============================================================================
方案2:分類出父子的歸屬,使用Mdicontent來裝所有的form
============================================================================
這個方式要在各大功能內拉出一個主框架Form並設為IsMdiContainer
找出我要的主要顯示視窗在「主框架Form」Loaded之後 預設載入
private void 主框_Load(object sender, EventArgs e)
{
訂單功能 form = new 訂單功能();
form.MdiParent = this;
form.Dock = DockStyle.Fill;
form.Show();
}
這樣可以讓畫面看起來只有開一個視窗 其實是已經開了 主框架+主功能 頁面了
之後要彈出的子視窗再歸屬在「主框架Form」的childfrom 下就行了,像是
Form[] charr = this.MdiParent.MdiChildren;
if (charr.Length == 0)
{
子視窗 c = new 子視窗();
c.MdiParent = this.MdiParent;
c.Show();
}
else
{
bool found = false;
foreach (Form chform in charr)
{
if (chform.Name == "子視窗")
{
chform.Activate();
found = true;
break;
}
else
found = false;
}
if (found == false)
{
子視窗 c = new 子視窗();
c.MdiParent = this.MdiParent;
c.Show();
}
}
但是MdiContainer一開始就是要讓人,可以在一個主框之下「可以同時顯示不同視窗的內容」
在主功能顯示並預設大小已經是DockStyle.Fill 一旦滑鼠在子畫面失去焦點時 你會發現你找不到子畫面了(暈)
接著就要不斷寫當子畫面 Leave 或 LostFocus 的事件來讓子畫面強制顯示在最上層 ,想也知道這個方法也是很爛的.....
============================================================================
方案3:使用showdialog 配合ShowInTaskbar屬性
============================================================================
對~~很多時候自己最符合的功能,其實就是這麼簡單
這個方案也是要歸屬出父子視窗
然後開啟子視窗的方式可改為
子視窗 c = new 子視窗();
c.ShowInTaskbar = false;
c.ShowDialog(this);
利用 ShowDialog要強制顯示的特性,它會自己鎖死其它視窗
再將 ShowInTaskbar (是否出現在window工作列) 屬性設定false ~~這樣就ok了
留言列表