2010-05-04 54 views
1

我有一個問題,那就是奇怪,我這,但希望不是太奇怪了別人。 :)一些背景:我正在開發一個簡單的IM客戶端,它允許用戶將消息廣播給多個收件人。目標是爲包含廣播消息文本的每個收件人創建一個聊天表單,然後僅在收件人響應廣播時才顯示該表單。但是,當應用程序收到響應後,嘗試找到特定聊天會話的表單(使用Application.OpenForms)時,無法找到它,除非我在創建時顯示它。我想避免在創建時顯示此表單,因爲這意味着用戶將在屏幕上看到閃光燈。形式似乎沒有真正創建,直到我告訴它,但它似乎必須有一個辦法做到這一點,而不顯示第一。任何人都可以協助實例化一個形式,後來發現它,沒有表現出最初

,如果需要,我可以提供代碼片段,我沒有在這個崗位,因爲這感覺更像是對我而言比在代碼中的錯誤觀念誤區。提前致謝!

回答

2

而不是使用形式作爲基類的,做它的其他方式,創建可以引用表單的類。這樣,你就可以隨時向班級通報內容,並在表格中反映出來(如果已初始化),而不是反過來。 您不應該依賴表單作爲對象的基礎。使用Application.OpenForms 應該是不必要的。

public class Contact 
{ 
    string displayname = String.Empty; 
    List<Message> history = new List<Message>(); 
    MessageForm theform = new MessageForm(this); 

    public void OnEvent(Message msg) 
    { 
     if(msg.Sender != me && !theform.Visible) 
      theform.Show(); 

    } 

    public void Tell(string message) 
    { 
    } 

} 

請某種名單的聯繫人,事情應該是比較簡單的。 (請注意,Windows窗體是不是線程安全的,如果你嘗試從不同的線程比主改變的任何控件的任何屬性會拋出異常)

+0

謝謝大家的意見。 @Jarle Moe,這似乎是最容易融入現有代碼的建議,我會繼續努力。由於我的問題已經得到解答(我做錯了),我相信這個問題可以結束。 – awilson53 2010-05-04 17:22:04

0

Windows窗體有一個像隱藏(),顯示()和激活方法()。使用這些方法解決您的問題。

0

爲什麼不存儲與聊天會話形式的參考,並用它來打電話.Show()當你需要顯示的形式:

session.form.Show(); 

然後,您可以創建窗體,不顯示它和你不每次要引用它時,都需要調用Application.OpenForms的開銷。

我知道這是說明明顯,但OpenForms不會發現,並沒有顯示出,因爲它是不開放的形式。

0

由於形式手柄還沒有生成,直到所示的形式,你可以手動分配它像這樣:

mf = new MainForm(); 

     /* Need to assign a handle to MainForm instance manually 
     as handle does not get created until form is shown */ 
     IntPtr handle = mf.Handle; 
相關問題