2011-11-15 41 views
1

我有一個視覺複雜的應用程序,包含大量用戶界面組件和第三方控件。在啓動時,隨着所有內容都調整大小並在Form_Load中載入內容(但主要是由於調整大小),它會進入瞬間的連接狀態。使用Winforms應用程序進行響應式啓動

所以我認爲解決方案可能是在Form_Load事件的開始時隱藏表單,然後在最後顯示它。但是,事實證明,當代碼進入Form_Load事件時,表單已經可見。

如何確保在準備就緒和調整大小時顯示錶單。

回答

4

Load事件在UI線程上執行。你不應該把邏輯處理放在UI線程中,因爲阻止它使UI不響應。

您應該分叉一個新線程(請參閱Thread類)並在那裏執行啓動邏輯。如果花費大約3秒鐘以上,則可能需要加載屏幕。您需要使用Form.Invoke()和委託來執行與UI線程交互的任何邏輯(例如更改文本框的文本)。

在您假設Load事件發生在窗體顯示時也是不正確的。 Load事件發生在組件初始化之後和顯示錶單之前,然後在顯示錶單時發生Shown事件。

2

你的假設是不完全正確:Form_Load(或者更準確地說:加載事件處理程序)在第一次顯示錶單時執行。確實,在這一點上你的表單已經可見,雖然不可用,因爲你的線程被你的FormLoad函數阻塞了。

你有兩個選擇:

  1. 使用閃屏,不具有控制和無頂欄,所以它沒有輸入,這將是不可見的,你的線程被阻塞。
  2. 在顯示錶格前準備好您的尺寸和位置。在調用Show之前設置大小和位置是完全合法的。例如在你的表單的構造函數中。
  3. 更改邏輯,以便長時間的計算不在UI線程中。 ThreadPool的線程處理非常簡單,然後調用表單上的方法,即Form.Invoke
相關問題