如何在使用其组件之前创建表单句柄?

Cas*_*roy 2 c# synchronization handle winforms

我正在动态实例化一个表单.在创建句柄之前,我无法与表单上的组件(例如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;
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢这种机制.我正在寻找一个优雅的解决方案.

请考虑我正在编码接口.我想过使用ManualResetEvent之类的东西,但是必须在实现接口的每个Form中实现和处理ManualResetEvent对我来说听起来不太吸引人.如果你不同意我的意见.那很好.我只是怀疑我目前的解决方案并不是最优雅的.

Kin*_*ing 6

您可以将代码添加到HandleCreated事件处理程序,如下所示:

private void Form1_HandleCreated(object sender, EventArgs e){
   //your code
}
Run Code Online (Sandbox Code Playgroud)

该事件未在"属性"窗口中列出,您必须使用代码注册事件处理程序:

HandleCreated += Form1_HandleCreated;
Run Code Online (Sandbox Code Playgroud)