2017-03-26 127 views
0

我有一個自定義「選項卡」概念的WinForms應用程序,因爲有3個按鈕調用其各自的面板「BringToFront()」方法。C#WinForms控制訂單更改事件

由於這些面板都是在初始化表單時初始化的,但它們包含自己獨立的功能,所以我不想初始化一些更密集的任務,直到該面板「切換」爲止。

例如,我的一個面板具有Twitter連接功能。如果我在面板初始化時初始化Twitter連接,則可能會失敗,理論上用戶使用完全不同的面板/功能。

我只希望它在用戶訪問此面板時嘗試連接到Twitter。

所以,我一直在閱讀MSDN,但找不到控件顯示順序發生變化時觸發的事件。

我遇到這些事件,但不知道哪個/如果有的話,這些工作或是最好的:

Panel.OnVisibleChanged Panel.OnEnter Panel.OnGotFocus

我還在學習C#,所以任何幫助/評論表示讚賞。

+1

對於每個面板在某處保留一個標誌,顯示面板是否已加載。創建一個切換到面板的方法。在該方法中,檢查面板是否仍未加載,然後加載並設置標誌並將其放在前面。 –

+0

這個問題是背地任務的一個很好的例子。一旦您感覺當前面板的屬性已設置,您可以開始在後臺初始化其他面板。面板的標籤屬性可以用來保存一個布爾值,如果它的設置與否。此外,您可以隱藏並顯示面板而不是BringToFront。這將觸發VisibleChanged事件,並且一旦可見,便於捕獲和處理。 –

+1

作爲另一種選擇,您可以在'UserControl'類中封裝面板的內容,然後在第一次單擊按鈕時檢查相關面板是否爲空,然後創建所需用戶控件的實例並將其添加到面板。您可以將加載邏輯封裝在用戶控件的加載事件中。 –

回答

3

我有同樣的問題,我通過使每個標籤實現一個接口和trigering它固定它每當我試圖加載它(ⅰ希望是有道理)(https://github.com/WithoutCaps/LimitlessUI/blob/master/LimitlessUI/TabsAdapter_WOC.cs

線30/31

if(tab is Tab_WOC) 
    ((Tab_WOC)tab).onShowTab(); 

隨意使用此代碼/庫

注:有演示應用程序呢!

+0

謝謝 - 雖然我覺得其他人可能提供了一個更強大的「正確」方式來做到這一點,這是我的實現:) –

+0

對不起,我沒有使用庫只是使用接口附加的方法所有面板類都有一個在點擊時通過單一方法調用的方法。 –

+0

林不知道其他awnsers是「適當的」或「過於複雜」的一點,我知道我的方式是簡單和乾淨。不要擔心回合不使用我的圖書館,它不是什麼大不了的,畢竟,即時編寫它主要是爲了我自己:) –

0

這個問題是背地任務的一個很好的例子。一旦您感覺當前面板的屬性已設置,您可以開始在後臺初始化其他面板。面板的標籤屬性可以用來保存一個布爾值,如果它的設置與否。此外,您可以隱藏並顯示面板而不是BringToFront。這將觸發VisibleChanged事件,並且一旦可見,便於捕獲和處理。 這是爲了向您展示背景工作者代碼的工作方式。

private void BackgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) 
    { 
     if (!Convert.ToBoolean(Panel1.Tag)) { 
      //Intialize panel1 
      Panel1.Tag = true; 
     } 
     if (!Convert.ToBoolean(Panel2.Tag)) { 
      //Intialize panel2 
      Panel2.Tag = true; 
     } 
     if (!Convert.ToBoolean(Panel3.Tag)) { 
      //Intialize panel3 
      Panel3.Tag = true; 
     } 
    } 
0

很明顯,我不知道你的項目佈局如何,但我看到兩個選項。

選項1:房產懶加載

創建,當你把它檢查是否一個字段爲空,如果是,與任何你想要的昂貴類構造函數的調用初始化它的屬性。

public TwitterCommunicator TwitterCommunicator => _twitterCommunicator ?? (_twitterCommunicator = new TwitterCommunicator()); 

public void AnotherTwitterPanelMethod() 
{ 
    TwitterCommunicator.LoadTweets(); 
} 

選項2:使用Lazy<T>

類似延遲加載屬性。實際上,使用Lazy會在您實際需要初始化時提供對象的惰性初始化。

public partial class MainForm : Form 
{ 
    public MainForm() 
    { 
     Lazy<TwitterCommunicator> _lazyTwitter = new Lazy<TwitterCommunicator>(); 
    } 
} 

public void SomeTwitterPanelMethod() 
{ 
    _lazyTwitter.Value.LoadTweets(); 
}