在用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了

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 richchen10 的頭像
    richchen10

    陽光灑肩頭--彷彿自由人

    richchen10 發表在 痞客邦 留言(0) 人氣()