Winform開發中的窗體重覆及靈活顯示問題 1.問題引入 在項目中需要實現主窗體點擊按鈕後打開子窗體,但是如果不限制的話每次點擊都會打開一個新窗體,用戶體驗不好還浪費記憶體。所以這裡要做的是限制每個子窗體只可以打開一次,如果打開後沒有關閉子窗體或者子窗體被最小化了,就直接把已打開的窗體激活並置頂顯示 ...
Winform開發中的窗體重覆及靈活顯示問題
1.問題引入
在項目中需要實現主窗體點擊按鈕後打開子窗體,但是如果不限制的話每次點擊都會打開一個新窗體,用戶體驗不好還浪費記憶體。所以這裡要做的是限制每個子窗體只可以打開一次,如果打開後沒有關閉子窗體或者子窗體被最小化了,就直接把已打開的窗體激活並置頂顯示。同時還要滿足不同的子窗體是可以共存的,也就是只能同時有一個子窗體A,子窗體B,子窗體C……但是子窗體ABC之間是可以同時存在並互相切換的。
2.解決思路
這裡我的做法是寫兩個方法:ShowOpenForm()用來激活已打開的窗體,同時返回Boolean值對應當前窗體的打開狀態,NewForm()用於第一次打開新窗體的時候實例化窗體對象,並設置相關參數。
3.參考代碼
整體結構
ShowOpenForm()方法:
1 private Boolean ShowOpenForm(string frmName) 2 { 3 //Application .OpenForms為已打開的窗體 4 foreach (Form frm in Application.OpenForms) 5 { 6 if (frm.Name == frmName)//如果傳遞的窗體名稱參數已經存在 7 { 8 frm.Activate();//激活已有窗體 9 if (frm.WindowState == FormWindowState.Minimized)//如果已有窗體被最小化了 10 { 11 frm.WindowState = FormWindowState.Normal;//恢復被最小化窗體的顯示 12 } 13 return false;//返回false說明窗體已打開 14 } 15 } 16 return true;//已打開的窗體里沒有作為參數傳遞的窗體,則返回true 17 }
NewForm()方法:
1 private void NewForm(Form objForm) 2 { 3 objForm.Show();//顯示要打開的窗體的 4 objForm.Top = objForm.Top + 64;//項目需要,顯示界面下移64像素 5 }
示例Click事件:
1 private void tsbVoucherQuery_Click(object sender, EventArgs e) 2 { 3 if (ShowOpenForm("FrmVoucherQuery"))//如果返回的Boolean值為true,則窗體沒打開,調用NewForm()方法 4 { 5 NewForm(new FrmVoucherQuery()); //調用打開新窗體方法,並直接實例化要打開的窗體作為參數窗體 6 } 7 }