回答
該Form.Shown event是一個很好的地方做任何可能需要超過一秒鐘的初始化。 Form.Shown只發生一次,僅在後窗體首先對用戶可見。
顯然,如果你有一個漫長的初始化,你仍然需要提供某種形式的視覺反饋,並可能會禁用表單的各個部分,直到完成。但是,如果初始化是不可避免的,Form.Shown至少允許你讓用戶知道應用程序沒有被凍結,並給出了它實際正在做什麼的反饋。
與Form.Load相比:從用戶角度來看,您的應用程序將被視爲更快地啓動,因爲您的表單在初始化完成時已經可見。
相比Form.Activated:您不必擔心運行多次的初始化,因爲激活的事件被稱爲每次你的形式隱藏/顯示,最小化/最大化時間等
相比構造函數:與Form.Load相似,只有初始化完成後,表單纔會可見。另外,您必須更加小心與可能未完全初始化的控件有關的時序/序列問題。
我嘗試過使用Shown事件,並發現它不起作用,正如您所描述的:每次顯示對話框時都會再次運行該方法。因此,如果我使用它來填充列表框,那麼每次顯示對話框時都會重複這些項目。我很困惑.... – Stewart 2017-03-07 19:17:26
在Load事件中做東西時,會造成異常,當它失敗時稍微容易閱讀並且恕我直言在語義上更清潔。實際上,這不會造成很大的差異。
對於較重的初始化,它通常在加載事件中完成。構造函數通常用於快速,簡單的字段初始化。例如,如果您必須對外部依賴項進行方法調用,則應從加載完成。
這取決於初始化的種類。例如,簡單的字段初始化可以在構造函數中完成,這樣可以避免您必須掛接事件,擁有其他方法等。
但是,在某些情況下,構造函數沒有您的信息需要。例如,如果您想根據您是處於設計模式還是運行模式來做不同的事情(例如,在運行模式下,您將連接到數據源,但在設計模式下,您希望顯示示例數據),那麼這必須被推遲到構建之後,因爲框架在構造對象之後才設置DesignMode。
實際上並非如此。您可以檢查構造函數中的LicenseManager.UsageMode(以及構造函數中的* only *)以檢查您是否處於設計模式。 – Eric 2010-01-15 07:18:15
較重的初始化在加載事件中也可能不是一個好主意,因爲它可能會增加加載時間並且可能會讓最終用戶感到不適。我更喜歡在Form Load中做一個基本的初始化(比如說......需要花費< 10秒),並在向用戶顯示之後完成其餘的繁重工作。要讓用戶等待進度指示器可以顯示。
想想如果您爲相同的表單運行兩次Show
或ShowDialog
會發生什麼情況。這兩個調用之間不能改變的所有東西都應該在構造函數中;所有初始化代碼都取決於根據顯示(對話框)調用必須處於將爲每個調用調用的事件處理程序中。例如,表單的所有者將在ShowDialog
中傳遞,而不是在構造函數中傳遞,並且對於2個不同的ShowDialog
調用可以不同,所以依賴於所有者的所有內容都不應該在構造函數中。
- 1. 哪裏更好地初始化字段?
- 2. os.environ初始化在哪裏?
- 3. 在哪裏初始化TempData
- 4. JSP在哪裏初始化?
- 5. 哪裏是最好的地方在Rails中初始化Singleton?
- 6. 哪種形式的初始化更好?
- 7. forks.c的total_forks在哪裏初始化?
- 8. Python的sys.path在哪裏初始化?
- 9. 在哪裏初始化我的TableView DataController?
- 10. QGLWidget paintEvent:在哪裏初始化openGL?
- 11. 在哪裏初始化木材和crashlytics
- 12. 在哪裏初始化一個NSMutableArray?
- 13. 我在哪裏初始化NSMutable Dictionary?
- 14. MSTAPI請求ID在哪裏初始化?
- 15. CherryPy + Jinja,在哪裏初始化環境
- 16. _mainViewController在哪裏聲明和初始化?
- 17. noty在初始化工作
- 18. 更好的初始化
- 19. 初始化後未初始化的全局變量的位置在哪裏?
- 20. C++數組初始化,好的做法
- 21. 初始化器列表初始化的數組存儲在哪裏?
- 22. 哪裏是初始化API的好地方?
- 23. 從哪裏初始化GCM的ID?
- 24. 在Flux/React.js中,在哪裏初始化jQuery插件?
- 25. 在哪裏初始化UITableViewController中的多個實例的結構
- 26. 在哪裏初始化經過驗證的序列化字段?
- 27. AS3中初始化類變量的「適當」位置在哪裏
- 28. Android在哪裏初始化小部件中的Crashlytics?
- 29. 在哪裏初始化ASP.NET MVC 3中的ObjectFactory?
- 30. 在哪裏初始化React容器中的Socket對象?
可能重複的[Winforms窗體構造函數與加載事件](http://stackoverflow.com/questions/264396/winforms-form-constructor-vs-load-event) – 2016-07-07 14:35:46