C#語言FormClosing與FormClosed事件中Args參數的CloseReason枚舉

個人操做系統是Win7旗艦版,VS版本是VS2012,.NET版本爲.NET Framework 4.5。windows

在窗體的FormClosing事件,第二個參數(FormClosingEventArgs類型)下有一個枚舉變量CloseReason,在窗體的FormClosed事件,第二個參數(FormClosedEventArgs類型)下也有一個枚舉變量CloseReason 。這個CloseReason枚舉在命名空間System.Windows.Forms下。函數

以下段代碼所示,CloseReason在窗體FormClosing事件的FormClosingEventArgs類型變量e中。測試

private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
    switch (e.CloseReason)
    {
        case CloseReason.None: { MessageBox.Show("Closing: CloseReason.None"); } break;
        case CloseReason.WindowsShutDown: { MessageBox.Show("Closing: CloseReason.WindowsShutDown"); } break;
        case CloseReason.MdiFormClosing: { MessageBox.Show("Closing: CloseReason.MdiFormClosing"); } break;
        case CloseReason.UserClosing: { MessageBox.Show("Closing: CloseReason.UserClosing"); } break;
        case CloseReason.TaskManagerClosing: { MessageBox.Show("Closing: CloseReason.TaskManagerClosing"); } break;
        case CloseReason.FormOwnerClosing: { MessageBox.Show("Closing: CloseReason.FormOwnerClosing"); } break;
        case CloseReason.ApplicationExitCall: { MessageBox.Show("Closing: CloseReason.ApplicationExitCall"); } break;
    }
}

從元數據看,該枚舉一共有下面7個枚舉值:this

#region 程序集 System.Windows.Forms.dll, v4.0.0.0
// C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Windows.Forms.dll
#endregion

using System;

namespace System.Windows.Forms
{
    // 摘要:
    //     指定窗體關閉的緣由。
    public enum CloseReason
    {
        // 摘要:
        //     關閉緣由未定義或者沒法肯定。
        None = 0,
        //
        // 摘要:
        //     操做系統正在關閉全部應用程序以便準備關機。
        WindowsShutDown = 1,
        //
        // 摘要:
        //     此多文檔界面 (MDI) 窗體的父窗體正在關閉。
        MdiFormClosing = 2,
        //
        // 摘要:
        //     用戶正在經過用戶界面 (UI) 關閉該窗體,例如經過單擊窗體窗口上的「關閉」按鈕,經過選擇窗口控制菜單上的「關閉」按鈕,或者經過按 Alt+F4
        //     等方式關閉。
        UserClosing = 3,
        //
        // 摘要:
        //     Microsoft Windows 任務管理器正在關閉應用程序。
        TaskManagerClosing = 4,
        //
        // 摘要:
        //     全部者窗體正在關閉。
        FormOwnerClosing = 5,
        //
        // 摘要:
        //     System.Windows.Forms.Application 類的 System.Windows.Forms.Application.Exit()
        //     方法被調用。
        ApplicationExitCall = 6,
    }
}

該枚舉的MSDN能夠參考頁面:spa

https://msdn.microsoft.com/en-us/library/system.windows.forms.closereason(v=vs.110).aspx操作系統

除去None類型,本文對6種枚舉值都進行了測試,在此記錄下測試的結果。code

一、CloseReason.WindowsShutDownorm

當Windows被註銷、關閉時觸發此CloseReason,不過不要在這裏加入MessageBox等元素,由於一旦Windows發現當前程序遲遲關不掉,就會將此程序強制關閉。事件

二、CloseReason.MdiFormClosing文檔

當前窗體爲Mdi子窗體時,Mdi容器窗體被關閉時,在觸發當前的FormClosing和FormClosed事件時提示此CloseReason。

將當前窗體做爲MdiParent打開另外一窗體的方法:

FormChild formChild = new FormChild();
formChild.MdiParent = this;
formChild.Show();

(須要將本窗體的IsMdiContainer設置爲True)

三、CloseReason.UserClosing

用戶手動關閉當前程序,好比調用Close()函數,或點擊程序右上角的「×」,關閉緣由都是CloseReason.UserClosing。

四、CloseReason.TaskManagerClosing

由任務管理器關閉窗口時,會觸發此事件,但我在測試的時候發現,任務管理器關閉窗口具備必定的強制性。設置斷點後可發現,FormClosing事件觸發後不久程序就會被任務管理器強制關閉,這個時間很是短,所以不適合在此作一些諸如彈出MessageBox的事情(由於沒有用)。

五、CloseReason.FormOwnerClosing

相似CloseReason.MdiFormClosing,若是窗體A是窗體B的owner,則窗體A關閉時,窗體B觸發FormClosing和FormClosed事件時使用此CloseReason。

關於窗體做爲owner的問題,能夠參考MSDN頁面:

https://msdn.microsoft.com/en-us/library/system.windows.window.owner(v=vs.110).aspx

將當前窗體做爲Owner打開另外一個窗體的方法:

FormChild formChild2 = new FormChild();
formChild2.Owner = this;
formChild2.Show();

六、CloseReason.ApplicationExitCall

調用Application.Exit()方法退出程序時,CloseReason爲此值。


最後再說下FormClosing、FormClosed事件的調用順序:

一、FormClosing事件在窗體關閉前觸發,FormClosed事件在窗體關閉後觸發

二、若是窗體A是mdi容器,窗體B的mdi-parent是窗體A,那麼事件的調用順序是:

窗體B - FormClosing事件 - CloseReason.MdiFormClosing

窗體A - FormClosing事件 - CloseReason.UserClosing

窗體B - FormClosed事件 - CloseReason.MdiFormClosing

窗體A - FormClosed事件 - CloseReason.UserClosing

三、若是窗體A是窗體B的owner,那麼事件的調用順序是:

窗體B - FormClosing事件 - CloseReason.FormOwnerClosing

窗體A - FormClosing事件 - CloseReason.UserClosing

窗體B - FormClosed事件 - CloseReason.FormOwnerClosing

窗體A - FormClosed事件 - CloseReason.UserClosing


最後分享下我用於測試此問題的C#工程,該工程使用VS2012創建:

http://pan.baidu.com/s/1pLF3FJH

END

相關文章
相關標籤/搜索