郵箱太多,用起來難免混亂。市面的郵箱軟件功能太強大,需要配POP什麼的,很麻煩。於是自己突發奇想,自作一個郵箱管理,可是在做管理窗口的時候出現了問題。管理窗口並非ShowDialog,那麼也就不能在方法的結束Dispose掉這個窗體。只能等待用戶關閉,但是如果用戶沒有關閉,再次調用顯示方法時,就會又顯示一個管理窗口。但是這是不願出現。
現在通過窗體Visable來僞關閉,並將Closing事件的e.Cancel置爲true,阻止窗口關閉。在顯示方法中判斷是否存在窗體,窗體存在就SHOW,存在但Visable爲false的則控制Visable爲true,並激活到前臺。
但是,在整個程序將退出時出了問題.
因爲,Application.Exit()將停止消息泵,並通知各窗體Close。因此,Exit方法會觸發Closing事件,那麼此時,管理窗口的關閉將永遠被阻止。導致父窗體也不關閉。於是在管理窗體的FormClosing事件中處理
- private void Form1_FormClosing(object sender, FormClosingEventArgs e)
- {
- e.Cancel = !(this.visable = WillClose);
- }
通過控制窗體全局變量WillClose來控制是否真正關閉。並新增關閉方法
- public void EnClose()
- {
- WillClose = true;
- this.Close();
- }
供外部調用,以真正關閉窗體。
Application.Exit()會通知各窗體關閉,但關閉會被阻止,也就說這個方法是不強制關閉窗體的。那麼爲了保證能完全關閉所有窗體,同時停止消息泵。那麼將退出按鈕寫爲
- private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
- {
- this.Close();
- }
在Closing事件中再Application.Exit()。但是Exit通知各窗體Close,是會觸發Closing事件的,那麼會再次執行事件的處理方法. 這也是部分人爲什麼在關閉時詢問是否關閉程序時,詢問兩遍的原因。
因此應該在Closed事件處理Application.Exit(). 最終
- private void Form1_FormClosing(object sender, FormClosingEventArgs e)
- {
- ManageForm.EnClose();
- }
- private void Form1_FormClosed(object sender, FormClosedEventArgs e)
- {
- Application.Exit();
- }
注:WillClose爲私有,且默認爲false;