在開發中,經常遇到需要創建一個非模態的對話框,彈出後在不關閉的情況下依舊可以查看其它窗體,關閉後資源也不會釋放,再次彈出依舊保存上次的結果,最典型的例子是將一些複雜的耗時的任務丟到後臺,通過該對話框查看任務的進度,例如360雲盤的傳輸進度功能。
實現思路:
第一步:新建一個窗體TestForm,顯示時將其顯示爲非模態
private void newform_Click(object sender, EventArgs e) { TestForm form1=new TestForm(); form1.show(); }
這一步很簡單,即創建了一個非模態對話框,但是運行時候發現,當我點擊關閉按鈕後,窗體關閉了,資源釋放了,新建一個窗體不能保存之前的內容了
第二步:處理關閉按鈕,不關閉窗體
一個方案是取消關閉按鈕,設置窗體的ControlBox屬性爲false,但是在任務欄的圖表中依舊會有關閉按鈕,用戶點擊後會造成運行錯誤;
解決方案其實很簡單,處理窗體的關閉按鈕事件(FormClosing)即可,代碼如下:
private void TestFrom_FormClosing(object sender, FormClosingEventArgs e) { this.Hide(); //隱藏窗體 e.Cancel = true; //取消關閉 }
同時,第一步也要調整,在程序啓動時,就已經生成了,即在主窗體中定義變量,單擊事件僅響應show方法
TestForm form1=new TestForm(); private void newform_Click(object sender, EventArgs e) { form1.show(); }
這樣就實現了form1爲非模態對話框且和程序同生命週期