2010-06-18 52 views
39

表單Form.Load,Form.ShownForm.Activated事件之間有什麼區別?他們被解僱的順序是什麼?Windows窗體中事件'Form.Load','Form.Shown'和'Form.Activated'的順序

+24

NEVER ,永遠,永遠在WINFORMS事件的順序!事實上,如果可能的話儘可能少使用事件,並且如果/當你使用很多事件時,他們應該只調用一些執行大部分工作的常見子事件。誠然,事件的順序不會改變,但是這種編程風格正在尋求錯誤(從我自己的角度講,而不幸的是主要是其他人的經驗)。並且不要在StackOverflow註釋中喊出來! – FastAl 2010-06-18 14:32:12

+17

@Anthony:MessageBox是一個很好的方法來搞亂事件順序。在Load事件結束之前,它將使Shown事件運行*。從不用MessageBox調試UI事件,Debug.WriteLine()是最好的。 – 2010-06-18 15:14:38

+2

我使用了Debug.WriteLine--感謝Hans :)在Load,Shown和Activated事件中。輸出窗口將事件序列顯示爲「加載」,「激活」和「最終顯示」。 – Ananth 2010-06-21 11:41:56

回答

12

而且,Form.Activate事件可以被多次觸發。例如,如果您從窗體中打開消息框,並且當您單擊該消息框的任何按鈕並返回到窗體,則會觸發Form.Activate。其他任何對話框也是如此,例如FileOpenDialog

+0

另外:實際上沒有在.net中測試過它,以確定它的行爲是否相同,但是我知道在vb6中,如果您一次一行地遍歷代碼,它會觸發表單加載事件,但不會激活事件,當你不明白爲什麼時這會引起誤解。 – 2012-02-26 21:17:57

+1

Activated事件是否創建表單的新實例? – 2016-01-07 15:38:42

3

的順序將是Form.Load,初始化的形式,並調用控件,Form.Shown,這標誌着幀可見(甚至在C++,創建表格後這樣做),以及Form.Activated,這給論壇焦點。

+4

這是不正確的..我使用Debug.WriteLine - 輸出窗口顯示的事件序列爲加載,激活,並最終顯示。 – Ananth 2010-06-27 02:23:29

+0

「調用控件」是什麼意思? – 2013-01-09 12:58:52

60

Windows Forms Events Lifecycle

  • 移動:當表單被移動時發生此事件。雖然默認情況下,當表單被實例化並啓動時,用戶不會移動它,但是在Load事件發生之前觸發此事件。
  • 加載:此事件發生在首次顯示錶單之前。
  • VisibleChanged:Visible屬性值更改時發生此事件。
  • 已激活:當代碼或用戶激活表單時發生此事件。
  • 顯示:只要首先顯示錶單,就會發生此事件。
  • Paint:控件重繪時發生此事件。
  • 取消激活:當表單失去焦點並且不是活動表單時發生此事件。
  • 關閉:表單關閉時發生此事件。
  • 閉合:當表單正在關閉時發生此事件。
+7

下面是[Windows窗體中的事件順序]的MSDN鏈接(http://msdn.microsoft.com/zh-cn/library/86faxx0d.aspx)。 – Jeremy 2012-04-10 00:21:49

+1

Activated事件是否創建表單的新實例? – 2016-01-07 15:37:47

19
  • 當表單已被初始化,其手柄已被創建之後,但在上映之前的Load事件觸發。在第一時間之後

  • Shown事件觸發的形式變得可見,當你調用form.Show()(或form.Visible = true)。
    如果你隱藏你的表格,然後再次顯示,Shown將再次觸發。 (但Load不會)

  • 當用戶切換到您的表單時,會觸發Activate事件。
    如果用戶切換到不同的程序(或表格),然後切換回您的表格,Activate將再次觸發。

+4

這並不準確,只顯示一次。 – 2010-06-18 15:17:35

+2

@Hans:錯了。我只是試了一下。如果您兩次調用ShowDialog,則顯示兩次。 – SLaks 2010-06-18 16:36:20

+2

嗯,不知道你在做什麼。加載兩次。不處理對話通常是一個錯誤。 – 2010-06-18 16:57:04

6

Form和Control類公開與應用程序啓動和關閉相關的一組事件。

Control.HandleCreated 
Control.BindingContextChanged 
Form.Load 
Control.VisibleChanged 
Form.Activated 
Form.Shown 

在應用程序關閉,主窗體的關閉事件按以下順序升高:

當Windows窗體應用程序啓動時,主要形式的啓動事件按照下面的順序提出
Form.Closing 
Form.FormClosing 
Form.Closed 
Form.FormClosed 
Form.Deactivate 

對焦和驗證活動

當你使用鍵盤更改焦點(TAB,SHIFT + TAB,等等),通過調用選擇或SelectNextControl方法,或通過ActiveControl屬性設置爲當前形式,焦點事件ntrol類發生以下順序:

Enter 
GotFocus 
Leave 
Validating 
Validated 
LostFocus 

當通過使用鼠標或通過調用Focus方法改變聚焦,聚焦控制類的事件發生在下列順序:

Enter 
GotFocus 
LostFocus 
Leave 
Validating 
Validated