2013-07-02 20 views
2

我在動態實例化一個表單。在創建句柄之前,我無法與表單上的組件(如TextBox)進行交互(否則,將引發異常)。在使用其組件之前,如何等待表單句柄已創建?

目前我阻止使用while循環線程:

public void OutputDesktopFrame(MessagingService service, DesktopFrame desktopFrame) 
{ 
    IRemoteDesktopView view = GetView(service); 
    view.UpdateFrame(desktopFrame); 
} 

private IRemoteDesktopView GetView(MessagingService service) 
{ 
    T view; 
    bool viewExists = _views.TryGetValue(service, out view); 

    if (viewExists == false) 
    { 
     view = CreateAndShowView(service); 
    } 

    return view; 
} 

private T CreateAndShowView(MessagingService service) 
{ 
    T remoteDesktopView = new T(); 

    _views.Add(service, remoteDesktopView); 

    Thread pumpThread = new Thread(() => remoteDesktopView.ShowDialog()); 
    pumpThread.Start(); 


    while (remoteDesktopView.IsHandleCreated == false) 
    { 
     //Do not return until the handle has been created! 
    } 

    return remoteDesktopView; 
} 

我不喜歡這樣的機制。我正在尋找一個優雅的解決方案。

請注意我正在編寫一個接口。我想過使用ManualResetEvent或類似的東西,但必須在每個實現了界面的Form中實現和處理ManualResetEvent,這聽起來並不吸引我。如果你不同意我的話。這很好。我只是懷疑我目前的解決方案並不是最優雅的。

+0

這段代碼非常沒用,Handle屬性在Show()方法返回後總會有一個有效值。到目前爲止,處理一個線程試圖敲擊一個表單的最簡單最簡單的方法是直到表單的Load事件觸發後才啓動線程。 –

+0

@HansPassant你說得很好。我用更完整的代碼示例更新了我的問題。 –

回答

5

您可以將代碼添加到HandleCreated事件處理程序是這樣的:

private void Form1_HandleCreated(object sender, EventArgs e){ 
    //your code 
} 

該事件不會在屬性窗口中,你必須使用代碼註冊事件處理程序:

HandleCreated += Form1_HandleCreated; 
+0

謝謝。我用更多的上下文更新了我的問題。考慮到更新的問題,我認爲這個事件並不合適。 –

+0

@Alex我猜這個異常是在'view.UpdateFrame(desktopFrame);'?如果不是,你可以突出或指出拋出異常的行嗎? –

+0

不會引發異常。 –

2

你必須等待句柄被創建。 所以你最終會在你的代碼中找到類似while (form.IsHandleCreated == false) { ... }的東西。 唯一的問題是放在哪裏。

如果你像上面的例子那樣做,你需要在每次創建表單時編寫代碼while如果你選擇了你提到的替代方案,使用表單提出的事件,你需要在每個方法中實現它形式(並創建一個事件處理程序並將其掛接)。

我不知道如果CreateAndShowForm()是一個框架方法,或者你可以改變自己。如果你可以改變它,那就是我要等待的地方。這樣你只需要編寫一次。

避免代碼重複的另一種方法是在表單中處理它,在您自己的抽象表單基類中實現它,並從該類派生出實際的表單。在我看來,對於這個問題來說這完全是過度的 - 對於很少的收穫,工作太多了。

如果您不能更改CreateAndShowForm(),我建議您使用上面的示例 - 是的,它絕對不是優雅的,但它完成了工作,源代碼很容易理解,並且它不需要事件處理的額外工作。

+0

這是一個很好的答案,我感謝你。但它不回答我的問題。不夠清楚是我的錯。我更新了我的問題。 –

相關問題